diff -Nuar a/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFieldToCollection.php b/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFieldToCollection.php
index 5fcf9df771a..c94808dbf7b 100644
--- a/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFieldToCollection.php
+++ b/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFieldToCollection.php
@@ -8,7 +8,6 @@ declare(strict_types=1);
 namespace Magento\InventoryCatalog\Model\ResourceModel;
 
 use Magento\Catalog\Model\ResourceModel\Product\Collection;
-use Magento\InventoryIndexer\Indexer\IndexStructure;
 use Magento\InventoryIndexer\Model\StockIndexTableNameResolverInterface;
 
 /**
@@ -20,14 +19,21 @@ class AddIsInStockFieldToCollection
      * @var StockIndexTableNameResolverInterface
      */
     private $stockIndexTableProvider;
+    /**
+     * @var StockStatusFilter
+     */
+    private $stockStatusFilter;
 
     /**
      * @param StockIndexTableNameResolverInterface $stockIndexTableProvider
+     * @param StockStatusFilter $stockStatusFilter
      */
     public function __construct(
-        StockIndexTableNameResolverInterface $stockIndexTableProvider
+        StockIndexTableNameResolverInterface $stockIndexTableProvider,
+        StockStatusFilter $stockStatusFilter
     ) {
         $this->stockIndexTableProvider = $stockIndexTableProvider;
+        $this->stockStatusFilter = $stockStatusFilter;
     }
 
     /**
@@ -39,12 +45,11 @@ class AddIsInStockFieldToCollection
      */
     public function execute($collection, int $stockId)
     {
-        $tableName = $this->stockIndexTableProvider->execute($stockId);
-
-        $collection->getSelect()->join(
-            ['inventory_in_stock' => $tableName],
-            'e.sku = inventory_in_stock.sku',
-            []
-        )->where('inventory_in_stock.' . IndexStructure::IS_SALABLE . ' = ?', 1);
+        $this->stockStatusFilter->execute(
+            $collection->getSelect(),
+            'e',
+            'inventory_in_stock',
+            $stockId
+        );
     }
 }
diff -Nuar a/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFilterToCollection.php b/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFilterToCollection.php
index c94d9b873c3..6631db8058d 100644
--- a/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFilterToCollection.php
+++ b/vendor/magento/module-inventory-catalog/Model/ResourceModel/AddIsInStockFilterToCollection.php
@@ -8,7 +8,6 @@ declare(strict_types=1);
 namespace Magento\InventoryCatalog\Model\ResourceModel;
 
 use Magento\Catalog\Model\ResourceModel\Product\Collection;
-use Magento\InventoryIndexer\Indexer\IndexStructure;
 use Magento\InventoryIndexer\Model\StockIndexTableNameResolverInterface;
 
 /**
@@ -20,29 +19,37 @@ class AddIsInStockFilterToCollection
      * @var StockIndexTableNameResolverInterface
      */
     private $stockIndexTableProvider;
+    /**
+     * @var StockStatusFilter
+     */
+    private $stockStatusFilter;
 
     /**
      * @param StockIndexTableNameResolverInterface $stockIndexTableProvider
+     * @param StockStatusFilter $stockStatusFilter
      */
     public function __construct(
-        StockIndexTableNameResolverInterface $stockIndexTableProvider
+        StockIndexTableNameResolverInterface $stockIndexTableProvider,
+        StockStatusFilter $stockStatusFilter
     ) {
         $this->stockIndexTableProvider = $stockIndexTableProvider;
+        $this->stockStatusFilter = $stockStatusFilter;
     }
 
     /**
+     * Modify "is in stock" collection filter to support non-default stocks.
+     *
      * @param Collection $collection
      * @param int $stockId
      * @return void
      */
     public function execute($collection, int $stockId)
     {
-        $tableName = $this->stockIndexTableProvider->execute($stockId);
-
-        $collection->getSelect()->join(
-            ['stock_status_index' => $tableName],
-            'e.sku = stock_status_index.sku',
-            []
-        )->where('stock_status_index.' . IndexStructure::IS_SALABLE . ' = ?', 1);
+        $this->stockStatusFilter->execute(
+            $collection->getSelect(),
+            'e',
+            'stock_status_index',
+            $stockId
+        );
     }
 }
diff -Nuar a/vendor/magento/module-inventory-catalog/Model/ResourceModel/StockStatusFilter.php b/vendor/magento/module-inventory-catalog/Model/ResourceModel/StockStatusFilter.php
new file mode 100644
index 00000000000..6c5cd84d538
--- /dev/null
+++ b/vendor/magento/module-inventory-catalog/Model/ResourceModel/StockStatusFilter.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\InventoryCatalog\Model\ResourceModel;
+
+use Magento\Framework\DB\Select;
+use Magento\InventoryIndexer\Indexer\IndexStructure;
+use Magento\InventoryIndexer\Model\StockIndexTableNameResolverInterface;
+
+/**
+ * Generic in-stock status filter for multi stocks inventory
+ */
+class StockStatusFilter
+{
+    /**
+     * @var StockIndexTableNameResolverInterface
+     */
+    private $stockIndexTableProvider;
+
+    /**
+     * @param StockIndexTableNameResolverInterface $stockIndexTableProvider
+     */
+    public function __construct(
+        StockIndexTableNameResolverInterface $stockIndexTableProvider
+    ) {
+        $this->stockIndexTableProvider = $stockIndexTableProvider;
+    }
+
+    /**
+     * Add in-stock status constraint to the select for non default stock
+     *
+     * @param Select $select
+     * @param string $productTableAlias
+     * @param string $stockStatusTableAlias
+     * @param int $stockId
+     * @return Select
+     */
+    public function execute(
+        Select $select,
+        string $productTableAlias,
+        string $stockStatusTableAlias,
+        int $stockId
+    ): Select {
+        $stockStatusTable = $this->stockIndexTableProvider->execute($stockId);
+        $isSalableFieldName = IndexStructure::IS_SALABLE;
+        $select->join(
+            [$stockStatusTableAlias => $stockStatusTable],
+            "{$stockStatusTableAlias}.sku = {$productTableAlias}.sku",
+            []
+        );
+        $select->where("{$stockStatusTableAlias}.{$isSalableFieldName} = ?", 1);
+        return $select;
+    }
+}
diff -Nuar a/vendor/magento/module-inventory-catalog/Plugin/CatalogInventory/Model/ResourceModel/StockStatusFilterPlugin.php b/vendor/magento/module-inventory-catalog/Plugin/CatalogInventory/Model/ResourceModel/StockStatusFilterPlugin.php
new file mode 100644
index 00000000000..d21aa0f0dd0
--- /dev/null
+++ b/vendor/magento/module-inventory-catalog/Plugin/CatalogInventory/Model/ResourceModel/StockStatusFilterPlugin.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\InventoryCatalog\Plugin\CatalogInventory\Model\ResourceModel;
+
+use Magento\CatalogInventory\Model\ResourceModel\StockStatusFilterInterface;
+use Magento\Framework\DB\Select;
+use Magento\InventoryCatalog\Model\ResourceModel\StockStatusFilter;
+use Magento\InventoryCatalogApi\Api\DefaultStockProviderInterface;
+use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
+use Magento\InventorySalesApi\Api\StockResolverInterface;
+use Magento\Store\Model\StoreManagerInterface;
+
+/**
+ * Legacy in-stock status filter plugin
+ */
+class StockStatusFilterPlugin
+{
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+    /**
+     * @var StockResolverInterface
+     */
+    private $stockResolver;
+    /**
+     * @var DefaultStockProviderInterface
+     */
+    private $defaultStockProvider;
+    /**
+     * @var StockStatusFilter
+     */
+    private $stockStatusFilter;
+
+    /**
+     * @param StoreManagerInterface $storeManager
+     * @param StockResolverInterface $stockResolver
+     * @param DefaultStockProviderInterface $defaultStockProvider
+     * @param StockStatusFilter $stockStatusFilter
+     */
+    public function __construct(
+        StoreManagerInterface $storeManager,
+        StockResolverInterface $stockResolver,
+        DefaultStockProviderInterface $defaultStockProvider,
+        StockStatusFilter $stockStatusFilter
+    ) {
+        $this->storeManager = $storeManager;
+        $this->stockResolver = $stockResolver;
+        $this->defaultStockProvider = $defaultStockProvider;
+        $this->stockStatusFilter = $stockStatusFilter;
+    }
+
+    /**
+     * Add in-stock status constraint to the select for non default stock
+     *
+     * @param StockStatusFilterInterface $subject
+     * @param callable $proceed
+     * @param Select $select
+     * @param string $productTableAlias
+     * @param string $stockStatusTableAlias
+     * @param int|null $websiteId
+     * @return Select
+     * @throws \Magento\Framework\Exception\LocalizedException
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function aroundExecute(
+        StockStatusFilterInterface $subject,
+        callable $proceed,
+        Select $select,
+        string $productTableAlias,
+        string $stockStatusTableAlias,
+        ?int $websiteId = null
+    ): Select {
+        $websiteCode = $this->storeManager->getWebsite($websiteId)->getCode();
+        $stock = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode);
+        $stockId = (int)$stock->getStockId();
+        if ($this->defaultStockProvider->getId() === $stockId) {
+            $select = $proceed(
+                $select,
+                $productTableAlias,
+                $stockStatusTableAlias,
+                $websiteId
+            );
+        } else {
+            $select = $this->stockStatusFilter->execute(
+                $select,
+                $productTableAlias,
+                $stockStatusTableAlias,
+                $stockId
+            );
+        }
+        return $select;
+    }
+}
diff -Nuar a/vendor/magento/module-inventory-catalog/etc/di.xml b/vendor/magento/module-inventory-catalog/etc/di.xml
index 3859f8f39d4..d37e686786f 100644
--- a/vendor/magento/module-inventory-catalog/etc/di.xml
+++ b/vendor/magento/module-inventory-catalog/etc/di.xml
@@ -161,4 +161,7 @@
         <plugin name="inventoryUpdate" type="Magento\InventoryCatalog\Plugin\Catalog\Controller\Adminhtml\Product\Action\Attribute\Save\ProcessInventoryPlugin"/>
         <plugin name="massAction" disabled="true"/>
     </type>
+    <type name="Magento\CatalogInventory\Model\ResourceModel\StockStatusFilterInterface">
+        <plugin name="inventory_catalog_stock_status_filter" type="Magento\InventoryCatalog\Plugin\CatalogInventory\Model\ResourceModel\StockStatusFilterPlugin"/>
+    </type>
 </config>
