diff --git a/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
new file mode 100644
index 0000000000000000000000000000000000000000..342b703ded0a50d409fbed14868af74aa80130a7
--- /dev/null
+++ b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Plugin\Model\AttributeSetRepository;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\Eav\Api\AttributeSetRepositoryInterface;
+use Magento\Eav\Api\Data\AttributeSetInterface;
+
+/**
+ * Delete related products after attribute set successfully removed.
+ */
+class RemoveProducts
+{
+    /**
+     * Retrieve products related to specific attribute set.
+     *
+     * @var CollectionFactory
+     */
+    private $collectionFactory;
+
+    /**
+     * RemoveProducts constructor.
+     *
+     * @param CollectionFactory $collectionFactory
+     */
+    public function __construct(CollectionFactory $collectionFactory)
+    {
+        $this->collectionFactory = $collectionFactory;
+    }
+
+    /**
+     * Delete related to specific attribute set products, if attribute set was removed successfully.
+     *
+     * @param AttributeSetRepositoryInterface $subject
+     * @param bool $result
+     * @param AttributeSetInterface $attributeSet
+     * @return bool
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function afterDelete(
+        AttributeSetRepositoryInterface $subject,
+        bool $result,
+        AttributeSetInterface $attributeSet
+    ) {
+        /** @var Collection $productCollection */
+        $productCollection = $this->collectionFactory->create();
+        $productCollection->addFieldToFilter('attribute_set_id', ['eq' => $attributeSet->getId()]);
+        $productCollection->delete();
+
+        return $result;
+    }
+}
diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
index 616bee43de00e521439cba4f2447c446bb0e7e03..d08108d1fc22bd7ae3b127c57cfdb8b500c2b6a9 100755
--- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
@@ -21,6 +21,8 @@ class UpgradeSchema implements UpgradeSchemaInterface
     /**
      * {@inheritdoc}
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
     {
@@ -126,6 +128,10 @@ class UpgradeSchema implements UpgradeSchemaInterface
             $this->fixCustomerGroupIdColumn($setup);
         }
 
+        if (version_compare($context->getVersion(), '2.2.4', '<')) {
+            $this->removeAttributeSetRelation($setup);
+        }
+
         $setup->endSetup();
     }
 
@@ -699,4 +705,20 @@ class UpgradeSchema implements UpgradeSchemaInterface
         );
         $setup->getConnection()->query($sql);
     }
+
+    /**
+     * Remove foreign key between catalog_product_entity and eav_attribute_set tables.
+     * Drop foreign key to delegate cascade on delete to plugin.
+     * @see \Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts
+     *
+     * @param SchemaSetupInterface $setup
+     * @return void
+     */
+    private function removeAttributeSetRelation(SchemaSetupInterface $setup)
+    {
+        $setup->getConnection()->dropForeignKey(
+            $setup->getTable('catalog_product_entity'),
+            $setup->getFkName('catalog_product_entity', 'attribute_set_id', 'eav_attribute_set', 'attribute_set_id')
+        );
+    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..712aeba59dffe47dbf58defffcf489519d55e3b6
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Test\Unit\Plugin\Model\AttributeSetRepository;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts;
+use Magento\Eav\Api\AttributeSetRepositoryInterface;
+use Magento\Eav\Api\Data\AttributeSetInterface;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for RemoveProducts plugin.
+ */
+class RemoveProductsTest extends TestCase
+{
+    /**
+     * @var RemoveProducts
+     */
+    private $testSubject;
+
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionFactory;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->collectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->testSubject = $objectManager->getObject(
+            RemoveProducts::class,
+            [
+                'collectionFactory' => $this->collectionFactory,
+            ]
+        );
+    }
+
+    /**
+     * Test plugin will delete all related products for given attribute set.
+     */
+    public function testAfterDelete()
+    {
+        $attributeSetId = '1';
+
+        /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collection */
+        $collection = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collection->expects(self::once())
+            ->method('addFieldToFilter')
+            ->with(self::identicalTo('attribute_set_id'), self::identicalTo(['eq' => $attributeSetId]));
+        $collection->expects(self::once())
+            ->method('delete');
+
+        $this->collectionFactory->expects(self::once())
+            ->method('create')
+            ->willReturn($collection);
+
+        /** @var AttributeSetRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSetRepository */
+        $attributeSetRepository = $this->getMockBuilder(AttributeSetRepositoryInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        /** @var AttributeSetInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSet */
+        $attributeSet = $this->getMockBuilder(AttributeSetInterface::class)
+            ->setMethods(['getId'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $attributeSet->expects(self::once())
+            ->method('getId')
+            ->willReturn($attributeSetId);
+
+        self::assertTrue($this->testSubject->afterDelete($attributeSetRepository, true, $attributeSet));
+    }
+}
diff --git a/app/code/Magento/Catalog/etc/adminhtml/di.xml b/app/code/Magento/Catalog/etc/adminhtml/di.xml
index b97e6fc1aa31891365a9eb901e80b456dab0b9a1..34d089580906f035f181e1b34cd85f77dfa59f70 100644
--- a/app/code/Magento/Catalog/etc/adminhtml/di.xml
+++ b/app/code/Magento/Catalog/etc/adminhtml/di.xml
@@ -184,4 +184,7 @@
             <argument name="scopeOverriddenValue" xsi:type="object">Magento\Catalog\Model\Attribute\ScopeOverriddenValue</argument>
         </arguments>
     </type>
+    <type name="Magento\Eav\Api\AttributeSetRepositoryInterface">
+        <plugin name="remove_products" type="Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts"/>
+    </type>
 </config>
diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml
index 18671a32bb4fbc05cd08e5581649de3f11b423aa..26ed173420adb95491694389c71d2a0848bfb198 100644
--- a/app/code/Magento/Catalog/etc/module.xml
+++ b/app/code/Magento/Catalog/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Catalog" setup_version="2.2.3">
+    <module name="Magento_Catalog" setup_version="2.2.4">
         <sequence>
             <module name="Magento_Eav"/>
             <module name="Magento_Cms"/>
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e8eaf70824db513958f25e29947dc8ad0907912
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Plugin\Model\AttributeSetRepository;
+
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\Eav\Api\AttributeSetRepositoryInterface;
+use Magento\Eav\Model\Entity\Attribute\Set;
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\Interception\PluginList;
+use Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollectionFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for RemoveProducts plugin.
+ * @magentoAppArea adminhtml
+ */
+class RemoveProductsTest extends TestCase
+{
+    /**
+     * @return void
+     */
+    public function testRemoveProductsIsRegistered()
+    {
+        $pluginInfo = Bootstrap::getObjectManager()->get(PluginList::class)
+            ->get(AttributeSetRepositoryInterface::class, []);
+        self::assertSame(RemoveProducts::class, $pluginInfo['remove_products']['instance']);
+    }
+
+    /**
+     * Test related to given attribute set products will be removed, if attribute set will be deleted.
+     *
+     * @magentoDataFixture Magento/Catalog/_files/attribute_set_with_product.php
+     */
+    public function testAfterDelete()
+    {
+        $attributeSet = Bootstrap::getObjectManager()->get(Set::class);
+        $attributeSet->load('empty_attribute_set', 'attribute_set_name');
+
+        $productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
+        $product = $productRepository->get('simple');
+
+        $productCollection = Bootstrap::getObjectManager()->get(CollectionFactory::class)->create();
+        $productCollection->addIdFilter($product->getId());
+        $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create();
+        $urlRewriteCollection->addFieldToFilter('entity_type', 'product');
+        $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId());
+
+        self::assertSame(1, $urlRewriteCollection->getSize());
+        self::assertSame(1, $productCollection->getSize());
+
+        $attributeSetRepository = Bootstrap::getObjectManager()->get(AttributeSetRepositoryInterface::class);
+        $attributeSetRepository->deleteById($attributeSet->getAttributeSetId());
+
+        $productCollection = Bootstrap::getObjectManager()->get(CollectionFactory::class)->create();
+        $productCollection->addIdFilter($product->getId());
+        $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create();
+        $urlRewriteCollection->addFieldToFilter('entity_type', 'product');
+        $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId());
+
+        self::assertSame(0, $urlRewriteCollection->getSize());
+        self::assertSame(0, $productCollection->getSize());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php
new file mode 100644
index 0000000000000000000000000000000000000000..95f277c7124bd83389452bd933e7fd0e94cac862
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require __DIR__ . '/../../Eav/_files/empty_attribute_set.php';
+require __DIR__ . '/../../Catalog/_files/product_simple.php';
+
+$product->setAttributeSetId($attributeSet->getId());
+$product->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd579bdb76f57d44e13bae3963f0f74a8227dff4
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require __DIR__ . '/../../Catalog/_files/product_simple_rollback.php';
+require __DIR__ . '/../../Eav/_files/empty_attribute_set_rollback.php';