diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php
index 920da739c8eb87109890f8d2d9f39b1699ad41f7..de647a34619dfe0355b9ff79277e3fc3ec24d131 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php
@@ -34,8 +34,9 @@ class ChildrenUrlRewriteGenerator
     ) {
         $this->childrenCategoriesProvider = $childrenCategoriesProvider;
         $this->categoryUrlRewriteGeneratorFactory = $categoryUrlRewriteGeneratorFactory;
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance()
-            ->get(MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php
index eb3fd3954bd6e4c6b74bf7d73370859748a730fe..c994b424641470bf728765594460266f3c5311f2 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php
@@ -57,8 +57,11 @@ class CurrentUrlRewritesRegenerator
         $this->urlFinder = $urlFinder;
         $this->urlRewriteFinder = $urlRewriteFinder ?: \Magento\Framework\App\ObjectManager::getInstance()
             ->get(\Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder::class);
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
-            ->get(\Magento\UrlRewrite\Model\MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory =  \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\UrlRewrite\Model\MergeDataProviderFactory::class
+            );
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php
index f95c72515c46ab53c79d6b6d22a91158fbf55abd..e565760f33448346c7434b1bb4b2fc816dbd173d 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php
@@ -67,8 +67,9 @@ class CategoryUrlRewriteGenerator
         $this->childrenUrlRewriteGenerator = $childrenUrlRewriteGenerator;
         $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator;
         $this->categoryRepository = $categoryRepository;
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance()
-            ->get(MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php
index acb8c4a89711356ce9e9490aaa5745111e7f968a..616e120ebafe4a49bebb5bce4c6e4f82b804cf72 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php
@@ -47,10 +47,7 @@ class DataCategoryHashMap implements HashMapInterface
      */
     public function getAllData($categoryId)
     {
-        if (!isset($this->hashMap[$categoryId])) {
-            $this->hashMap[$categoryId] = $this->generateData($categoryId);
-        }
-        return $this->hashMap[$categoryId];
+        return $this->generateData($categoryId);
     }
 
     /**
@@ -58,25 +55,28 @@ class DataCategoryHashMap implements HashMapInterface
      */
     public function getData($categoryId, $key)
     {
-        $this->getAllData($categoryId);
-        return $this->hashMap[$categoryId][$key];
+        $categorySpecificData = $this->generateData($categoryId);
+        return $categorySpecificData[$key];
     }
 
     /**
-     * Queries the database and returns results
+     * Returns an array of categories ids that includes category identified by $categoryId and all its subcategories
      *
      * @param int $categoryId
      * @return array
      */
     private function generateData($categoryId)
     {
-        $category = $this->categoryRepository->get($categoryId);
-        return $this->collection->addIdFilter($this->getAllCategoryChildrenIds($category))
-            ->getAllIds();
+        if (!isset($this->hashMap[$categoryId])) {
+            $category = $this->categoryRepository->get($categoryId);
+            $this->hashMap[$categoryId] = $this->collection->addIdFilter($this->getAllCategoryChildrenIds($category))
+                ->getAllIds();
+        }
+        return $this->hashMap[$categoryId];
     }
 
     /**
-     * Queries sub-categories ids from a category
+     * Queries the database for sub-categories ids from a category
      *
      * @param CategoryInterface $category
      * @return int[]
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php
index bcc82ce8e44a2017ff8ed3f7c1907cb74e8bc985..032ed5e13023e1de62c7c111ed8889d7e6dab6b6 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php
@@ -58,7 +58,8 @@ class DataCategoryUrlRewriteDatabaseMap implements DatabaseMapInterface
     }
 
     /**
-     * Queries the database and returns the name of the temporary table where data is stored
+     * Queries the database for all category url rewrites that are affected by the category identified by $categoryId
+     * It returns the name of the temporary table where the resulting data is stored
      *
      * @param int $categoryId
      * @return string
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php
index 0a3a99f8a0e7c3b728801f2e39db39e61beb6883..8864226d069d290034c540503e1ee882e5147e90 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php
@@ -38,10 +38,7 @@ class DataCategoryUsedInProductsHashMap implements HashMapInterface
      */
     public function getAllData($categoryId)
     {
-        if (!isset($this->hashMap[$categoryId])) {
-            $this->hashMap[$categoryId] = $this->generateData($categoryId);
-        }
-        return $this->hashMap[$categoryId];
+        return $this->generateData($categoryId);
     }
 
     /**
@@ -49,45 +46,49 @@ class DataCategoryUsedInProductsHashMap implements HashMapInterface
      */
     public function getData($categoryId, $key)
     {
-        $this->getAllData($categoryId);
-        return $this->hashMap[$categoryId][$key];
+        $categorySpecificData = $this->generateData($categoryId);
+        return $categorySpecificData[$key];
     }
 
     /**
-     * Queries the database and returns results
+     * Returns an array of product ids for all DataProductHashMap list,
+     * that occur in other categories not part of DataCategoryHashMap list
      *
      * @param int $categoryId
      * @return array
      */
     private function generateData($categoryId)
     {
-        $productsLinkConnection = $this->connection->getConnection();
-        $select = $productsLinkConnection->select()
-            ->from($this->connection->getTableName('catalog_category_product'), ['category_id'])
-            ->where(
-                $productsLinkConnection->prepareSqlCondition(
-                    'product_id',
-                    [
-                        'in' => $this->hashMapPool->getDataMap(
-                            DataProductHashMap::class,
-                            $categoryId
-                        )->getAllData($categoryId)
-                    ]
-                )
-            )
-            ->where(
-                $productsLinkConnection->prepareSqlCondition(
-                    'category_id',
-                    [
-                        'nin' => $this->hashMapPool->getDataMap(
-                            DataCategoryHashMap::class,
-                            $categoryId
-                        )->getAllData($categoryId)
-                    ]
+        if (!isset($this->hashMap[$categoryId])) {
+            $productsLinkConnection = $this->connection->getConnection();
+            $select = $productsLinkConnection->select()
+                ->from($this->connection->getTableName('catalog_category_product'), ['category_id'])
+                ->where(
+                    $productsLinkConnection->prepareSqlCondition(
+                        'product_id',
+                        [
+                            'in' => $this->hashMapPool->getDataMap(
+                                DataProductHashMap::class,
+                                $categoryId
+                            )->getAllData($categoryId)
+                        ]
+                    )
                 )
-            )->group('category_id');
+                ->where(
+                    $productsLinkConnection->prepareSqlCondition(
+                        'category_id',
+                        [
+                            'nin' => $this->hashMapPool->getDataMap(
+                                DataCategoryHashMap::class,
+                                $categoryId
+                            )->getAllData($categoryId)
+                        ]
+                    )
+                )->group('category_id');
 
-        return $productsLinkConnection->fetchCol($select);
+            $this->hashMap[$categoryId] = $productsLinkConnection->fetchCol($select);
+        }
+        return $this->hashMap[$categoryId];
     }
 
     /**
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php
index 74731a7d40e206a3dd2645abb0a13fa8b3e00ffd..a20b837e4096ad3155aca948e393b8b79597a22a 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php
@@ -45,10 +45,7 @@ class DataProductHashMap implements HashMapInterface
      */
     public function getAllData($categoryId)
     {
-        if (!isset($this->hashMap[$categoryId])) {
-            $this->hashMap[$categoryId] = $this->generateData($categoryId);
-        }
-        return $this->hashMap[$categoryId];
+        return $this->generateData($categoryId);
     }
 
     /**
@@ -56,38 +53,40 @@ class DataProductHashMap implements HashMapInterface
      */
     public function getData($categoryId, $key)
     {
-        $this->getAllData($categoryId);
-        return $this->hashMap[$categoryId][$key];
+        $categorySpecificData = $this->generateData($categoryId);
+        return $categorySpecificData[$key];
     }
 
     /**
-     * Queries the database and returns results
+     * Returns an array of ids of all visible products and assigned to a category and all its subcategories
      *
      * @param int $categoryId
      * @return array
      */
     private function generateData($categoryId)
     {
-        $productsCollection = $this->collectionFactory->create();
-        $productsCollection->getSelect()
-            ->joinInner(
-                ['cp' => $this->connection->getTableName('catalog_category_product')],
-                'cp.product_id = e.entity_id',
-                []
-            )
-            ->where(
-                $productsCollection->getConnection()->prepareSqlCondition(
-                    'cp.category_id',
-                    [
-                        'in' => $this->hashMapPool->getDataMap(
-                            DataCategoryHashMap::class,
-                            $categoryId
-                        )->getAllData($categoryId)
-                    ]
+        if (!isset($this->hashMap[$categoryId])) {
+            $productsCollection = $this->collectionFactory->create();
+            $productsCollection->getSelect()
+                ->joinInner(
+                    ['cp' => $this->connection->getTableName('catalog_category_product')],
+                    'cp.product_id = e.entity_id',
+                    []
                 )
-            )->group('e.entity_id');
-
-        return $productsCollection->getAllIds();
+                ->where(
+                    $productsCollection->getConnection()->prepareSqlCondition(
+                        'cp.category_id',
+                        [
+                            'in' => $this->hashMapPool->getDataMap(
+                                DataCategoryHashMap::class,
+                                $categoryId
+                            )->getAllData($categoryId)
+                        ]
+                    )
+                )->group('e.entity_id');
+            $this->hashMap[$categoryId] = $productsCollection->getAllIds();
+        }
+        return $this->hashMap[$categoryId];
     }
 
     /**
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php
index bca04d727aefe60deb4e0d1e00e7c39de1b749f0..c369e2d62a6c25fffbc88a2a21ee27b78e63671f 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php
@@ -72,7 +72,8 @@ class DataProductUrlRewriteDatabaseMap implements DatabaseMapInterface
     }
 
     /**
-     * Queries the database and returns the name of the temporary table where data is stored
+     * Queries the database for all category url rewrites that are affected by the category identified by $categoryId
+     * It returns the name of the temporary table where the resulting data is stored
      *
      * @param int $categoryId
      * @return string
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php
index 32f81e246156f4de0fa888fb725ab4b7e969900c..c2a9a89a33fb5dc689886e5e071c391f99eadd01 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php
@@ -5,10 +5,11 @@
  */
 namespace Magento\CatalogUrlRewrite\Model\Map;
 
-use \Magento\Framework\DB\Select;
+use Magento\Framework\DB\Select;
 
 /**
  * Interface for a mysql data type of a map
+ *
  * Is used to get data by a unique key from a temporary table in mysql to prevent memory usage
  * It internally holds the knowledge the creation of the actual data and it initializes itself when we call getData
  * We should always call destroyTableAdapter when we don't need anymore the temporary tables
@@ -17,6 +18,7 @@ interface DatabaseMapInterface
 {
     /**
      * Gets data by key from a map identified by a category Id
+     *
      * The key is a unique identifier that matches the values of the index used to build the temporary table
      *
      * Example "1_2" where ids would correspond to store_id entity_id
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php
index 5dbe1ed12b8611fb161c3f5aba2f3c1a990ffa0f..30732013eace4df7906333bbd43935b2f5761d84 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php
@@ -50,6 +50,11 @@ class DatabaseMapPool
                     'category' => $categoryId
                 ]
             );
+            if (!$this->dataArray[$key] instanceof DatabaseMapInterface) {
+                throw new \InvalidArgumentException(
+                    $instanceName . ' does not implement interface ' . DatabaseMapInterface::class
+                );
+            }
         }
         return $this->dataArray[$key];
     }
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php
index 3e806fcbd805d0171ca729cf34c83663bd60c118..341cdb1a4fdb1aba3375bace3a687e9d7fd273ee 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php
@@ -5,11 +5,12 @@
  */
 namespace Magento\CatalogUrlRewrite\Model\Map;
 
-use \Magento\Framework\DB\Select;
+use Magento\Framework\DB\Select;
 
 /**
  * Interface for a hash data map
- * It is used for classes tht would build hash maps and store them into memory
+ *
+ * It is used for classes that will build hash maps and store them into memory
  * The initialization is done transparently whenever getAllData or getData is called
  * The map, upon initialization, might have a dependency on some other DataMapInterfaces
  * The map has to free memory after we're done using it
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php
index 74ede5393cf67c0619cd2f70b22a3b554826ec45..bc6be808d4d9a96e7cd8a42ed106c7266f209c40 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php
@@ -44,10 +44,6 @@ class HashMapPool
     public function getDataMap($instanceName, $categoryId)
     {
         $key = $instanceName . '-' . $categoryId;
-        $reflectionClass = new \ReflectionClass($instanceName);
-        if (!$reflectionClass->implementsInterface(HashMapInterface::class)) {
-            throw new \Exception($instanceName . ' does not implement interface ' . HashMapInterface::class);
-        }
         if (!isset($this->dataArray[$key])) {
             $this->dataArray[$key] = $this->objectManager->create(
                 $instanceName,
@@ -55,6 +51,11 @@ class HashMapPool
                     'category' => $categoryId
                 ]
             );
+            if (!$this->dataArray[$key] instanceof HashMapInterface) {
+                throw new \InvalidArgumentException(
+                    $instanceName . ' does not implement interface ' . HashMapInterface::class
+                );
+            }
         }
         return $this->dataArray[$key];
     }
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php
index dfa8d87644ad61649d9748027fe8d80396f7814e..bcadfd848e8830461c380b86aeb32bdc116a6a96 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php
@@ -11,8 +11,11 @@ use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
 use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory;
 
 /**
- * Allows query to Category and Product UrlRewrite Database Map or UrlFinderInterface by identifiers
+ * Finds specific queried url rewrites identified by specific fields
  *
+ * A group of identifiers specifies a query consumed by the client to retrieve existing url rewrites from the database
+ * Clients will query a map of DatabaseMapInterface type through this class resulting into a set of url rewrites results
+ * Each map type will fallback to a UrlFinderInterface by identifiers for unmapped values
  */
 class UrlRewriteFinder
 {
@@ -29,7 +32,7 @@ class UrlRewriteFinder
     private $urlRewritePrototype;
 
     /** @var array */
-    private $urlRewriteClassNames;
+    private $urlRewriteClassNames = [];
 
     /**
      * @param DatabaseMapPool $databaseMapPool
@@ -41,10 +44,7 @@ class UrlRewriteFinder
         DatabaseMapPool $databaseMapPool,
         UrlFinderInterface $urlFinder,
         UrlRewriteFactory $urlRewriteFactory,
-        $urlRewriteClassNames = [
-        self::ENTITY_TYPE_PRODUCT => DataProductUrlRewriteDatabaseMap::class,
-        self::ENTITY_TYPE_CATEGORY => DataCategoryUrlRewriteDatabaseMap::class
-        ]
+        array $urlRewriteClassNames = []
     ) {
         $this->databaseMapPool = $databaseMapPool;
         $this->urlFinder = $urlFinder;
@@ -53,7 +53,8 @@ class UrlRewriteFinder
     }
 
     /**
-     * Queries by identifiers from maps or falls-back to UrlFinderInterface
+     * Retrieves existing url rewrites filtered by identifiers from prebuild database maps
+     * This method will fall-back to by using UrlFinderInterface when map type is not found in configured list
      *
      * @param int $entityId
      * @param int $storeId
@@ -86,7 +87,7 @@ class UrlRewriteFinder
     }
 
     /**
-     * Transfer array values to url rewrite object values
+     * Transfers an array values to url rewrite object values
      *
      * @param array $data
      * @return UrlRewrite[]
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php
index b801a84cc482095701c454f18bd2ccc656527448..dee95f236841ef6c3c4ceb5e32eaf4de8cdda238 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php
@@ -75,8 +75,9 @@ class CurrentUrlRewritesRegenerator
         $this->urlRewriteFactory = $urlRewriteFactory;
         $this->urlRewritePrototype = $urlRewriteFactory->create();
         $this->urlRewriteFinder = $urlRewriteFinder ?: ObjectManager::getInstance()->get(UrlRewriteFinder::class);
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance()
-            ->get(MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php
index 4df9fde0f2638fdb46c9305116d59b9ca86860e3..6e357459de8d3790c9e57624c1a7dbb1a9910268 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php
@@ -88,8 +88,9 @@ class ProductScopeRewriteGenerator
         $this->categoriesUrlRewriteGenerator = $categoriesUrlRewriteGenerator;
         $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator;
         $this->anchorUrlRewriteGenerator = $anchorUrlRewriteGenerator;
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance()
-            ->get(MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php
index 27053c21cffa37e63c4d4387fcacaae9ea562746..f76db7bef44d5b81936015bb033990c36205bc54 100644
--- a/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php
+++ b/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php
@@ -134,8 +134,9 @@ class AfterImportDataObserver implements ObserverInterface
         $this->storeManager = $storeManager;
         $this->urlRewriteFactory = $urlRewriteFactory;
         $this->urlFinder = $urlFinder;
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance()
-            ->get(MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php
index b864285b06a9f8d7a2a55a1414f703e4cbd62d48..dd0250049a426187f674ac61ad60e8c78ac02f67 100644
--- a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php
+++ b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php
@@ -71,32 +71,17 @@ class CategoryProcessUrlRewriteSavingObserver implements ObserverInterface
             || $category->dataHasChangedFor('is_anchor')
             || $category->getIsChangedProductList()
         ) {
-            $this->initializeUrlRewritesDataMaps($category);
-
             $categoryUrlRewriteResult = $this->categoryUrlRewriteGenerator->generate($category);
             $this->urlRewriteBunchReplacer->doBunchReplace($categoryUrlRewriteResult);
 
             $productUrlRewriteResult = $this->urlRewriteHandler->generateProductUrlRewrites($category);
             $this->urlRewriteBunchReplacer->doBunchReplace($productUrlRewriteResult);
 
+            //frees memory for maps that are self-initialized in multiple classes that were called by the generators
             $this->resetUrlRewritesDataMaps($category);
         }
     }
 
-    /**
-     * Initializes data maps to be further used
-     *
-     * @param Category $category
-     * @return void
-     */
-    private function initializeUrlRewritesDataMaps($category)
-    {
-        foreach ($this->dataUrlRewriteClassNames as $className) {
-            $this->databaseMapPool->getDataMap($className, $category->getEntityId());
-        }
-
-    }
-
     /**
      * Resets used data maps to free up memory and temporary tables
      *
diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
index 464824e7eefe80eb34101916388c042a3d25c6bf..727dd744cd8a7c9556f4a6889fb48844b0bf3c00 100644
--- a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
+++ b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
@@ -64,8 +64,9 @@ class UrlRewriteHandler
         $this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
         $this->urlPersist = $urlPersist;
         $this->productCollectionFactory = $productCollectionFactory;
-        $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance()
-            ->get(MergeDataProviderFactory::class);
+        if (!isset($mergeDataProviderFactory)) {
+            $mergeDataProviderFactory = $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+        }
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php
index d5abe69ff79777cf02067899eff0d434c76620a9..f36799f789fbdb3a9c287f4e14e1c3abab5b3c36 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php
@@ -5,8 +5,7 @@
  */
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model;
 
-use \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
-
+use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
 use Magento\Catalog\Model\Category;
 use Magento\Store\Model\ScopeInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php
index d9351b4e426ded57289b5af3b21377567e6aa8d4..78b114f60da858acb0d8bbd2e07edd87dcfb5ad0 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php
@@ -47,8 +47,22 @@ class HashMapPoolTest extends \PHPUnit_Framework_TestCase
             ->method('create')
             ->willReturnOnConsecutiveCalls($dataCategoryMapMock, $dataProductMapMock, $dataProductMapMockOtherCategory);
         $this->assertEquals($dataCategoryMapMock, $this->model->getDataMap(DataCategoryHashMap::class, 1));
-        $this->assertEquals($dataCategoryMapMock, $this->model->getDataMap(DataCategoryHashMap::class, 1));
+        $this->assertSame($dataCategoryMapMock, $this->model->getDataMap(DataCategoryHashMap::class, 1));
         $this->assertEquals($dataProductMapMock, $this->model->getDataMap(DataProductHashMap::class, 1));
         $this->assertEquals($dataProductMapMockOtherCategory, $this->model->getDataMap(DataCategoryHashMap::class, 2));
     }
+
+    /**
+     * Tests getDataMap with exception
+     */
+    public function testGetDataMapException()
+    {
+        $nonInterface = $this->getMock(HashMapPool::class, [], [], '', false);
+
+        $this->objectManagerMock->expects($this->any())
+            ->method('create')
+            ->willReturn($nonInterface);
+        $this->setExpectedException(\InvalidArgumentException::class);
+        $this->model->getDataMap(HashMapPool::class, 1);
+    }
 }
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 2a8149960c6d414b123977faa16f736d0c4b7367..b0c4500dab3e02f4d35aed41eb57b54a3e54cfd4 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php
@@ -45,12 +45,18 @@ class UrlRewriteFinderTest extends \PHPUnit_Framework_TestCase
             ->method('create')
             ->willReturn($this->urlRewritePrototypeMock);
 
+        $urlRewriteClassesNamesArray = [
+            UrlRewriteFinder::ENTITY_TYPE_PRODUCT => DataProductUrlRewriteDatabaseMap::class,
+            UrlRewriteFinder::ENTITY_TYPE_CATEGORY => DataCategoryUrlRewriteDatabaseMap::class
+        ];
+
         $this->model = (new ObjectManager($this))->getObject(
             UrlRewriteFinder::class,
             [
                 'databaseMapPool' => $this->databaseMapPoolMock,
                 'urlFinder' => $this->urlFinderMock,
-                'urlRewriteFactory' => $this->urlRewriteFactoryMock
+                'urlRewriteFactory' => $this->urlRewriteFactoryMock,
+                'urlRewriteClassNames' => $urlRewriteClassesNamesArray
             ]
         );
     }
diff --git a/app/code/Magento/CatalogUrlRewrite/etc/di.xml b/app/code/Magento/CatalogUrlRewrite/etc/di.xml
index 5a8974fc52da4b619b73dc627ea8d35159d5ac71..7f0fc718083ecab1df47dd659bbbcac78e14a77f 100644
--- a/app/code/Magento/CatalogUrlRewrite/etc/di.xml
+++ b/app/code/Magento/CatalogUrlRewrite/etc/di.xml
@@ -23,4 +23,12 @@
     <type name="Magento\UrlRewrite\Model\StorageInterface">
         <plugin name="storage_plugin" type="Magento\CatalogUrlRewrite\Model\Category\Plugin\Storage"/>
     </type>
+    <type name="Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder">
+        <arguments>
+            <argument name="urlRewriteClassNames" xsi:type="array">
+                <item name="product" xsi:type="string">Magento\CatalogUrlRewrite\Model\Map\DataProductUrlRewriteDatabaseMap</item>
+                <item name="category" xsi:type="string">Magento\CatalogUrlRewrite\Model\Map\DataCategoryUrlRewriteDatabaseMap</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php
index 3e57c7176b734cd231b10c4031b37fcb2448f5c2..76aa5d368be4c805155b374245799197e4b538dd 100644
--- a/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php
+++ b/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php
@@ -35,7 +35,7 @@ class MergeDataProviderTest extends \PHPUnit_Framework_TestCase
      * @param array $urlRewriteMockArray
      * @param String $expectedData
      * @param int $arrayCount
-     * @dataProvider getMergeTestParameters
+     * @dataProvider mergeDataProvider
      * @return void
      */
     public function testMerge($urlRewriteMockArray, $expectedData, $arrayCount)
@@ -56,11 +56,11 @@ class MergeDataProviderTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * Data provider  for testMerge
+     * Data provider for testMerge
      *
      * @return array
      */
-    public function getMergeTestParameters()
+    public function mergeDataProvider()
     {
         $urlRewriteMock1 = $this->getMock(UrlRewrite::class, [], [], '', false);
 
diff --git a/lib/internal/Magento/Framework/DB/TemporaryTableService.php b/lib/internal/Magento/Framework/DB/TemporaryTableService.php
index afc4d884638885d5062dee17324f31ff9f188b59..62d1a0d65cfb5c294e6f9b7771366d10cfcc853f 100644
--- a/lib/internal/Magento/Framework/DB/TemporaryTableService.php
+++ b/lib/internal/Magento/Framework/DB/TemporaryTableService.php
@@ -71,7 +71,11 @@ class TemporaryTableService
         foreach ($indexes as $indexName => $columns) {
             $renderedColumns = implode(',', array_map([$adapter, 'quoteIdentifier'], $columns));
 
-            $indexType = sprintf('INDEX %s USING %s', $adapter->quoteIdentifier($indexName), "{$indexMethod}");
+            $indexType = sprintf(
+                'INDEX %s USING %s',
+                $adapter->quoteIdentifier($indexName),
+                $indexMethod
+            );
 
             if ($indexName === 'PRIMARY') {
                 $indexType = 'PRIMARY KEY';
@@ -86,7 +90,7 @@ class TemporaryTableService
             'CREATE TEMPORARY TABLE %s %s ENGINE=%s IGNORE (%s)',
             $adapter->quoteIdentifier($name),
             $indexStatements ? '(' . implode(',', $indexStatements) . ')' : '',
-            "{$engine}",
+            $adapter->quoteIdentifier($engine),
             "{$select}"
         );