IGNITE-20564 Storage profile configurations (#2897)

diff --git a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java
index 0549a0d..33c21eb 100644
--- a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java
+++ b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java
@@ -275,7 +275,7 @@
                         "aimem",
                         "aipersist",
                         "rocksDb",
-                        "storageProfiles"
+                        "storages"
                 )
         );
     }
diff --git a/modules/cluster-management/build.gradle b/modules/cluster-management/build.gradle
index 071979b..eb9cd45 100644
--- a/modules/cluster-management/build.gradle
+++ b/modules/cluster-management/build.gradle
@@ -37,6 +37,7 @@
     implementation project(':ignite-raft-api')
     implementation project(':ignite-vault')
     implementation project(':ignite-rocksdb-common')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-security')
     implementation libs.jetbrains.annotations
     implementation libs.fastutil.core
@@ -54,6 +55,7 @@
     testFixturesImplementation project(':ignite-core')
     testFixturesImplementation project(':ignite-raft')
     testFixturesImplementation project(':ignite-raft-api')
+    testFixturesImplementation project(':ignite-storage-configuration')
     testFixturesImplementation project(':ignite-vault')
     testFixturesImplementation project(':ignite-security')
     testFixturesImplementation testFixtures(project(':ignite-core'))
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java
index 71e556d..19024ea 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.cluster.management;
 
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
 
@@ -39,7 +40,7 @@
     Map<String, String> systemAttributes();
 
     /**
-     * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564
+     * List of storage profiles, which the node supports.
      */
-    Map<String, String> storageProfiles();
+    List<String> storageProfiles();
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java
index 8cdf0d8..2fde99e 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java
@@ -25,8 +25,8 @@
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributeView;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfileView;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
+import org.apache.ignite.internal.storage.configurations.StorageProfileView;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 
 /**
  * This class is responsible for retrieving local node attributes
@@ -37,11 +37,11 @@
 
     private final NodeAttributesConfiguration nodeAttributesConfiguration;
 
-    private final StorageProfilesConfiguration storageProfilesConfiguration;
+    private final StoragesConfiguration storageProfilesConfiguration;
 
     public NodeAttributesCollector(
             NodeAttributesConfiguration nodeAttributesConfiguration,
-            StorageProfilesConfiguration storageProfilesConfiguration
+            StoragesConfiguration storageProfilesConfiguration
     ) {
         this.nodeAttributesConfiguration = nodeAttributesConfiguration;
         this.storageProfilesConfiguration = storageProfilesConfiguration;
@@ -65,11 +65,12 @@
 
     /** {@inheritDoc} */
     @Override
-    public Map<String, String> storageProfiles() {
-        NamedListView<StorageProfileView> storageProfiles = storageProfilesConfiguration.storageProfiles().value();
+    public List<String> storageProfiles() {
+        NamedListView<StorageProfileView> storageProfiles = storageProfilesConfiguration.profiles().value();
 
         return storageProfiles.stream()
-                .collect(Collectors.toUnmodifiableMap(StorageProfileView::name, StorageProfileView::engine));
+                .map(StorageProfileView::name)
+                .collect(Collectors.toList());
     }
 
     /** {@inheritDoc} */
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
index a2eb334..03abb39 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
@@ -36,6 +36,6 @@
 
     @Override
     public Collection<RootKey<?, ?>> rootKeys() {
-        return List.of(ClusterManagementConfiguration.KEY, NodeAttributesConfiguration.KEY, StorageProfilesConfiguration.KEY);
+        return List.of(ClusterManagementConfiguration.KEY, NodeAttributesConfiguration.KEY);
     }
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java
index 7ee6868..dbc2458 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java
@@ -229,7 +229,7 @@
 
         // Nodes will be removed from a topology, so it is safe to set nodeAttributes to the default value
         Set<LogicalNode> logicalNodes = nodes.stream()
-                .map(n -> new LogicalNode(n, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap()))
+                .map(n -> new LogicalNode(n, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))
                 .collect(Collectors.toSet());
 
         logicalTopology.removeNodes(logicalNodes);
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java
index bc257df..3d96958 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cluster.management.raft.commands;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.internal.cluster.management.network.messages.CmgMessageGroup;
 import org.apache.ignite.network.ClusterNode;
@@ -51,5 +52,5 @@
     Map<String, String> systemAttributes();
 
     @Nullable
-    Map<String, String> storageProfiles();
+    List<String> storageProfiles();
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java
index 530e71e..31fe771 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cluster.management.topology.api;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
@@ -41,9 +42,11 @@
     @IgniteToStringInclude
     private final Map<String, String> systemAttributes;
 
-    // TODO: add javadoc https://issues.apache.org/jira/browse/IGNITE-20564
+    /**
+     * List of storage profiles, which the node supports.
+     */
     @IgniteToStringInclude
-    private final Map<String, String> storageProfiles;
+    private final List<String> storageProfiles;
 
     /**
      * Constructor.
@@ -61,7 +64,7 @@
 
         this.userAttributes = Collections.emptyMap();
         this.systemAttributes = Collections.emptyMap();
-        this.storageProfiles = Collections.emptyMap();
+        this.storageProfiles = Collections.emptyList();
     }
 
     /**
@@ -71,7 +74,7 @@
      * @param userAttributes  Node attributes defined in configuration.
      */
     public LogicalNode(ClusterNode clusterNode, Map<String, String> userAttributes) {
-        this(clusterNode, userAttributes, Collections.emptyMap(), Collections.emptyMap());
+        this(clusterNode, userAttributes, Collections.emptyMap(), Collections.emptyList());
     }
 
     /**
@@ -80,19 +83,19 @@
      * @param clusterNode Represents a node in a cluster.
      * @param userAttributes Node attributes defined in configuration.
      * @param systemAttributes Internal node attributes provided by system components at startup.
-     * @param storageProfiles TODO: add javadoc https://issues.apache.org/jira/browse/IGNITE-20564
+     * @param storageProfiles List of storage profiles, which the node supports.
      */
     public LogicalNode(
             ClusterNode clusterNode,
             Map<String, String> userAttributes,
             Map<String, String> systemAttributes,
-            Map<String, String> storageProfiles
+            List<String> storageProfiles
     ) {
         super(clusterNode.id(), clusterNode.name(), clusterNode.address(), clusterNode.nodeMetadata());
 
         this.userAttributes = userAttributes == null ? Collections.emptyMap() : userAttributes;
         this.systemAttributes = systemAttributes == null ? Collections.emptyMap() : systemAttributes;
-        this.storageProfiles = storageProfiles == null ? Collections.emptyMap() : storageProfiles;
+        this.storageProfiles = storageProfiles == null ? Collections.emptyList() : (List<String>) storageProfiles;
     }
 
     /**
@@ -101,7 +104,7 @@
      * @param clusterNode    Represents a node in a cluster.
      */
     public LogicalNode(ClusterNode clusterNode) {
-        this(clusterNode, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
+        this(clusterNode, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList());
     }
 
     /**
@@ -123,11 +126,11 @@
     }
 
     /**
-     * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+     * Returns the list of storage profiles, which the node supports.
      *
-     * @return add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+     * @return List of storage profiles, which the node supports.
      */
-    public Map<String, String> storageProfiles() {
+    public List<String> storageProfiles() {
         return storageProfiles;
     }
 
diff --git a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java
index f8d622a..26347ad 100644
--- a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java
+++ b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java
@@ -28,10 +28,10 @@
 import java.util.stream.Stream;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.network.NetworkAddress;
@@ -56,7 +56,7 @@
     private static NodeAttributesConfiguration userNodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     protected static List<MockNode> createNodes(int numNodes, TestInfo testInfo, Path workDir) {
         StaticNodeFinder nodeFinder = createNodeFinder(numNodes);
@@ -70,7 +70,7 @@
                         raftConfiguration,
                         cmgConfiguration,
                         userNodeAttributes,
-                        storageProfilesConfiguration
+                        storagesConfiguration
 
                 ))
                 .collect(toList());
@@ -85,7 +85,7 @@
                 raftConfiguration,
                 cmgConfiguration,
                 userNodeAttributes,
-                storageProfilesConfiguration
+                storagesConfiguration
         );
 
         cluster.add(node);
diff --git a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java
index fb30286..8e744a0 100644
--- a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java
+++ b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java
@@ -29,7 +29,6 @@
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.RocksDbClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
@@ -39,6 +38,7 @@
 import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.util.ReverseIterator;
 import org.apache.ignite.internal.vault.VaultManager;
 import org.apache.ignite.internal.vault.persistence.PersistentVaultService;
@@ -86,7 +86,7 @@
             RaftConfiguration raftConfiguration,
             ClusterManagementConfiguration cmgConfiguration,
             NodeAttributesConfiguration nodeAttributes,
-            StorageProfilesConfiguration storageProfilesConfiguration
+            StoragesConfiguration storageProfilesConfiguration
     ) {
         this.testInfo = testInfo;
         this.nodeFinder = nodeFinder;
diff --git a/modules/metastorage/build.gradle b/modules/metastorage/build.gradle
index cb6078b..f36ef9c 100644
--- a/modules/metastorage/build.gradle
+++ b/modules/metastorage/build.gradle
@@ -52,6 +52,7 @@
     integrationTestImplementation project(':ignite-rest')
     integrationTestImplementation project(':ignite-raft')
     integrationTestImplementation project(":ignite-raft-api")
+    integrationTestImplementation project(':ignite-storage-configuration')
     integrationTestImplementation project(":ignite-vault")
     integrationTestImplementation project(":ignite-security")
     integrationTestImplementation testFixtures(project(':ignite-core'))
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
index b66bffd..22c1403 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
@@ -48,7 +48,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.ClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
@@ -75,6 +74,7 @@
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
 import org.apache.ignite.internal.raft.service.RaftGroupService;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.vault.VaultManager;
@@ -109,7 +109,7 @@
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     /**
      * Large interval to effectively disable idle safe time propagation.
@@ -170,7 +170,7 @@
                     clusterStateStorage,
                     logicalTopology,
                     cmgConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             var logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
index e8e501e..98fbff6 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
@@ -51,7 +51,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -75,6 +74,7 @@
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.vault.VaultManager;
@@ -100,7 +100,7 @@
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -159,7 +159,7 @@
                     clusterStateStorage,
                     logicalTopology,
                     cmgConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             components.add(cmgManager);
diff --git a/modules/page-memory/build.gradle b/modules/page-memory/build.gradle
index 479cdbd..ce426fb 100644
--- a/modules/page-memory/build.gradle
+++ b/modules/page-memory/build.gradle
@@ -25,6 +25,7 @@
     implementation project(':ignite-api')
     implementation project(':ignite-core')
     implementation project(':ignite-storage-api')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-configuration-api')
     implementation project(':ignite-file-io')
     implementation libs.jetbrains.annotations
diff --git a/modules/runner/build.gradle b/modules/runner/build.gradle
index 59eaa14..2644614 100644
--- a/modules/runner/build.gradle
+++ b/modules/runner/build.gradle
@@ -61,6 +61,7 @@
     implementation project(':ignite-sql-engine')
     implementation project(':ignite-client-handler')
     implementation project(':ignite-compute')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-storage-rocksdb')
     implementation project(':ignite-storage-page-memory')
     implementation project(':ignite-transactions')
@@ -126,6 +127,7 @@
     integrationTestImplementation project(':ignite-client')
     integrationTestImplementation project(':ignite-client-handler')
     integrationTestImplementation project(':ignite-storage-api')
+    integrationTestImplementation project(':ignite-storage-configuration')
     integrationTestImplementation project(':ignite-storage-page-memory')
     integrationTestImplementation project(':ignite-storage-rocksdb')
     integrationTestImplementation project(':ignite-index')
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
index 41da3d4..2b18223 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
@@ -58,11 +58,12 @@
 
     private static final String NODE_ATTRIBUTES = "{region:{attribute:\"US\"},storage:{attribute:\"SSD\"}}";
 
-    private static final String STORAGE_PROFILES = "{lru_rocks:{engine:\"rocksDb\"},segmented_aipersist:{engine:\"aipersist\"}}";
+    // TODO: https://issues.apache.org/jira/browse/IGNITE-20990 Replace dummy with the real target storages.
+    private static final String STORAGE_PROFILES = "{lru_rocks:{engine:\"dummy\"},segmented_aipersist:{engine:\"dummy\"}}";
 
     private static final Map<String, String> NODE_ATTRIBUTES_MAP = Map.of("region", "US", "storage", "SSD");
 
-    private static final Map<String, String> STORAGE_PROFILES_MAP = Map.of("lru_rocks", "rocksDb", "segmented_aipersist", "aipersist");
+    private static final List<String> STORAGE_PROFILES_LIST = List.of("lru_rocks", "segmented_aipersist");
 
     @Language("JSON")
     private static final String NODE_BOOTSTRAP_CFG_TEMPLATE_WITH_NODE_ATTRIBUTES_AND_STORAGE_PROFILES = "{\n"
@@ -75,8 +76,8 @@
             + "  nodeAttributes: {\n"
             + "    nodeAttributes: " + NODE_ATTRIBUTES
             + "  },\n"
-            + "  storageProfiles: {\n"
-            + "    storageProfiles: " + STORAGE_PROFILES
+            + "  storages: {\n"
+            + "    profiles: " + STORAGE_PROFILES
             + "  },\n"
             + "  clientConnector: { port:{} },\n"
             + "  rest.port: {}\n"
@@ -171,7 +172,7 @@
         assertThat(event.eventType, is(EventType.VALIDATED));
         assertThat(event.node.name(), is(secondIgnite.name()));
         assertThat(event.node.userAttributes(), is(NODE_ATTRIBUTES_MAP));
-        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_MAP));
+        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_LIST));
 
         event = events.poll(10, TimeUnit.SECONDS);
 
@@ -180,7 +181,7 @@
         assertThat(event.node.name(), is(secondIgnite.name()));
         assertThat(event.topologyVersion, is(2L));
         assertThat(event.node.userAttributes(), is(NODE_ATTRIBUTES_MAP));
-        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_MAP));
+        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_LIST));
 
         assertThat(events, is(empty()));
 
@@ -194,7 +195,7 @@
         assertThat(event.node.name(), is(secondIgnite.name()));
         assertThat(event.topologyVersion, is(3L));
         assertThat(event.node.userAttributes(), is(Collections.emptyMap()));
-        assertThat(event.node.storageProfiles(), is(Collections.emptyMap()));
+        assertThat(event.node.storageProfiles(), is(Collections.emptyList()));
 
         assertThat(events, is(empty()));
     }
@@ -218,7 +219,7 @@
         assertTrue(secondNode.isPresent());
 
         assertThat(secondNode.get().userAttributes(), is(NODE_ATTRIBUTES_MAP));
-        assertThat(secondNode.get().storageProfiles(), is(STORAGE_PROFILES_MAP));
+        assertThat(secondNode.get().storageProfiles(), is(STORAGE_PROFILES_LIST));
     }
 
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
index 305c8b2..76bc03b 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
@@ -42,7 +42,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -61,6 +60,7 @@
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -101,7 +101,7 @@
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -171,7 +171,7 @@
                     clusterStateStorage,
                     logicalTopology,
                     clusterManagementConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             var logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
index 6f8b835..7c09838 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
@@ -37,7 +37,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -54,6 +53,7 @@
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -84,7 +84,7 @@
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -145,7 +145,7 @@
                     clusterStateStorage,
                     logicalTopology,
                     clusterManagementConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             var logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index f4e5110..0537d7e 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -69,7 +69,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.RocksDbClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -115,6 +114,7 @@
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModule;
 import org.apache.ignite.internal.storage.DataStorageModules;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.systemview.SystemViewManagerImpl;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.table.TableViewInternal;
@@ -176,7 +176,7 @@
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -261,7 +261,7 @@
                 clusterStateStorage,
                 logicalTopology,
                 clusterManagementConfiguration,
-                new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
         );
 
         LongSupplier partitionIdleSafeTimePropagationPeriodMsSupplier
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index ca1f634..ba5bacc 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -55,7 +55,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.ClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.raft.RocksDbClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
@@ -137,6 +136,7 @@
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModule;
 import org.apache.ignite.internal.storage.DataStorageModules;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.systemview.SystemViewManagerImpl;
 import org.apache.ignite.internal.systemview.api.SystemViewManager;
 import org.apache.ignite.internal.table.distributed.TableManager;
@@ -425,7 +425,7 @@
         NodeAttributesCollector nodeAttributesCollector =
                 new NodeAttributesCollector(
                         nodeConfigRegistry.getConfiguration(NodeAttributesConfiguration.KEY),
-                        nodeConfigRegistry.getConfiguration(StorageProfilesConfiguration.KEY)
+                        nodeConfigRegistry.getConfiguration(StoragesConfiguration.KEY)
                 );
 
         cmgMgr = new ClusterManagementGroupManager(
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
index 2f73c04..14c4d10 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
@@ -565,7 +565,7 @@
                             String nodeNameSep = SystemViewManagerImpl.NODE_ATTRIBUTES_LIST_SEPARATOR;
                             String nodeNamesString = String.join(nodeNameSep, systemViewForNode);
 
-                            return new LogicalNode(logicalNode, Map.of(), Map.of(attrName, nodeNamesString), Map.of());
+                            return new LogicalNode(logicalNode, Map.of(), Map.of(attrName, nodeNamesString), List.of());
                         }
                     })
                     .collect(Collectors.toList());
diff --git a/modules/storage-configuration/README.md b/modules/storage-configuration/README.md
new file mode 100644
index 0000000..a73bcc6
--- /dev/null
+++ b/modules/storage-configuration/README.md
@@ -0,0 +1 @@
+# Storage Configuration
diff --git a/modules/storage-configuration/build.gradle b/modules/storage-configuration/build.gradle
new file mode 100644
index 0000000..ee25c6f
--- /dev/null
+++ b/modules/storage-configuration/build.gradle
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+apply from: "$rootDir/buildscripts/java-core.gradle"
+apply from: "$rootDir/buildscripts/publishing.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+
+dependencies {
+    annotationProcessor project(":ignite-configuration-annotation-processor")
+    annotationProcessor libs.auto.service
+
+    implementation project(':ignite-configuration-api')
+    implementation libs.jetbrains.annotations
+    implementation libs.auto.service.annotations
+}
+
+description = 'ignite-storage-configuration'
diff --git a/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageEngineConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageEngineConfigurationSchema.java
new file mode 100644
index 0000000..44a95b6
--- /dev/null
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageEngineConfigurationSchema.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.storage.configurations;
+
+import org.apache.ignite.configuration.annotation.PolymorphicConfigInstance;
+
+/**
+ * Dummy storage engine configuration schema to prevent the errors from configuration framework, while
+ * TODO: https://issues.apache.org/jira/browse/IGNITE-20990 is not implemented yet.
+ */
+@PolymorphicConfigInstance("dummy")
+public class DummyStorageEngineConfigurationSchema extends StorageEngineConfigurationSchema {
+}
diff --git a/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageProfileConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageProfileConfigurationSchema.java
new file mode 100644
index 0000000..900750e
--- /dev/null
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageProfileConfigurationSchema.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.storage.configurations;
+
+import org.apache.ignite.configuration.annotation.PolymorphicConfigInstance;
+
+/**
+ * Dummy storage profile configuration schema to prevent the errors from configuration framework, while
+ * TODO: https://issues.apache.org/jira/browse/IGNITE-20990 is not implemented yet.
+ */
+@PolymorphicConfigInstance("dummy")
+public class DummyStorageProfileConfigurationSchema extends StorageProfileConfigurationSchema {
+}
diff --git a/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageEngineConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageEngineConfigurationSchema.java
new file mode 100644
index 0000000..ef49dab
--- /dev/null
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageEngineConfigurationSchema.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.storage.configurations;
+
+import org.apache.ignite.configuration.annotation.PolymorphicConfig;
+import org.apache.ignite.configuration.annotation.PolymorphicId;
+
+/**
+ * Storage engine configuration schema.
+ */
+@PolymorphicConfig
+public class StorageEngineConfigurationSchema {
+
+    /** Storage engine name. */
+    @PolymorphicId
+    public String name;
+}
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageProfileConfigurationSchema.java
similarity index 66%
rename from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
rename to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageProfileConfigurationSchema.java
index af01ab2..7673405 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageProfileConfigurationSchema.java
@@ -15,22 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
 
-import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.InjectedName;
-import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.annotation.PolymorphicConfig;
+import org.apache.ignite.configuration.annotation.PolymorphicId;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Storage profile configuration schema.
  */
-@Config
+@PolymorphicConfig
 public class StorageProfileConfigurationSchema {
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
+
+    /** Storage engine name. */
+    @PolymorphicId
+    public String engine;
+
     @InjectedName
     public String name;
 
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @Value(hasDefault = true)
-    public String engine = "";
 }
diff --git a/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationModule.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationModule.java
new file mode 100644
index 0000000..d68fc3f
--- /dev/null
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationModule.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.storage.configurations;
+
+import com.google.auto.service.AutoService;
+import java.util.Collection;
+import java.util.List;
+import org.apache.ignite.configuration.ConfigurationModule;
+import org.apache.ignite.configuration.RootKey;
+import org.apache.ignite.configuration.annotation.ConfigurationType;
+
+/**
+ * Storages configuration module.
+ */
+@AutoService(ConfigurationModule.class)
+public class StoragesConfigurationModule implements ConfigurationModule {
+    /** {@inheritDoc} */
+    @Override
+    public ConfigurationType type() {
+        return ConfigurationType.LOCAL;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Collection<RootKey<?, ?>> rootKeys() {
+        return List.of(StoragesConfiguration.KEY);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Collection<Class<?>> polymorphicSchemaExtensions() {
+        return List.of(
+                DummyStorageEngineConfigurationSchema.class,
+                DummyStorageProfileConfigurationSchema.class
+        );
+    }
+}
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfilesConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationSchema.java
similarity index 64%
rename from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfilesConfigurationSchema.java
rename to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationSchema.java
index 0dea143..f327ed4 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfilesConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationSchema.java
@@ -15,20 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
+
+import static org.apache.ignite.configuration.annotation.ConfigurationType.LOCAL;
 
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
-import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Root for the storage engine and storage profiles configurations.
  */
-@ConfigurationRoot(rootName = "storageProfiles", type = ConfigurationType.LOCAL)
-public class StorageProfilesConfigurationSchema {
+@ConfigurationRoot(rootName = "storages", type = LOCAL)
+public class StoragesConfigurationSchema {
+
     /**
-     * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+     * Storage engines configuration.
      */
     @NamedConfigValue
-    public StorageProfileConfigurationSchema storageProfiles;
+    public StorageEngineConfigurationSchema engines;
+
+    /**
+     * Storage profiles configuration.
+     */
+    @NamedConfigValue
+    public StorageProfileConfigurationSchema profiles;
+
 }
diff --git a/modules/storage-rocksdb/build.gradle b/modules/storage-rocksdb/build.gradle
index 82a139c..3fad167 100644
--- a/modules/storage-rocksdb/build.gradle
+++ b/modules/storage-rocksdb/build.gradle
@@ -24,6 +24,7 @@
     annotationProcessor libs.auto.service
 
     implementation project(':ignite-storage-api')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-rocksdb-common')
     implementation project(':ignite-schema')
     implementation project(':ignite-core')
diff --git a/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java b/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
index a738de0..d965d11 100644
--- a/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
+++ b/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
@@ -349,7 +349,7 @@
                 systemAttributes = Map.of();
             }
 
-            topology.add(new LogicalNode(clusterNode, Map.of(), systemAttributes, Map.of()));
+            topology.add(new LogicalNode(clusterNode, Map.of(), systemAttributes, List.of()));
         }
 
         return new LogicalTopologySnapshot(1, topology);
diff --git a/modules/table/build.gradle b/modules/table/build.gradle
index 189e095..74acccc 100644
--- a/modules/table/build.gradle
+++ b/modules/table/build.gradle
@@ -108,6 +108,7 @@
     integrationTestImplementation project(':ignite-raft-api')
     integrationTestImplementation project(':ignite-affinity')
     integrationTestImplementation project(':ignite-storage-rocksdb')
+    integrationTestImplementation project(':ignite-storage-configuration')
     integrationTestImplementation project(':ignite-distribution-zones')
     integrationTestImplementation project(':ignite-catalog')
     integrationTestImplementation project(':ignite-metastorage-api')
diff --git a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
index 4b631aa..361f038 100644
--- a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
+++ b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
@@ -95,7 +95,6 @@
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -147,6 +146,9 @@
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModules;
 import org.apache.ignite.internal.storage.StorageException;
+import org.apache.ignite.internal.storage.configurations.DummyStorageEngineConfigurationSchema;
+import org.apache.ignite.internal.storage.configurations.DummyStorageProfileConfigurationSchema;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.storage.impl.TestDataStorageModule;
 import org.apache.ignite.internal.storage.impl.TestStorageEngine;
 import org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryDataStorageModule;
@@ -230,7 +232,7 @@
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -845,10 +847,15 @@
                             NetworkConfiguration.KEY,
                             RestConfiguration.KEY,
                             ClientConnectorConfiguration.KEY,
+                            StoragesConfiguration.KEY,
                             PersistentPageMemoryStorageEngineConfiguration.KEY,
                             VolatilePageMemoryStorageEngineConfiguration.KEY),
                     List.of(),
-                    List.of(UnsafeMemoryAllocatorConfigurationSchema.class)
+                    List.of(
+                            UnsafeMemoryAllocatorConfigurationSchema.class,
+                            DummyStorageEngineConfigurationSchema.class,
+                            DummyStorageProfileConfigurationSchema.class
+                    )
             );
 
             Path configPath = workDir.resolve(testInfo.getDisplayName());
@@ -858,6 +865,7 @@
                     List.of(NetworkConfiguration.KEY,
                             PersistentPageMemoryStorageEngineConfiguration.KEY,
                             VolatilePageMemoryStorageEngineConfiguration.KEY,
+                            StoragesConfiguration.KEY,
                             RestConfiguration.KEY,
                             ClientConnectorConfiguration.KEY),
                     new LocalFileConfigurationStorage(configPath, nodeCfgGenerator),
@@ -894,7 +902,7 @@
                     clusterStateStorage,
                     logicalTopology,
                     clusterManagementConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             LogicalTopologyServiceImpl logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/settings.gradle b/settings.gradle
index 7d78fff..10319a2 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -55,6 +55,7 @@
 include(':ignite-metastorage')
 include(':ignite-rest-api')
 include(':ignite-storage-rocksdb')
+include(':ignite-storage-configuration')
 include(':ignite-configuration-annotation-processor')
 include(':ignite-compute')
 include(':ignite-metrics')
@@ -81,6 +82,7 @@
 project(":ignite-dev-utilities").projectDir = file('dev-utilities')
 project(":ignite-page-memory").projectDir = file('modules/page-memory')
 project(":ignite-storage-api").projectDir = file('modules/storage-api')
+project(":ignite-storage-configuration").projectDir = file('modules/storage-configuration')
 project(":ignite-network-annotation-processor").projectDir = file('modules/network-annotation-processor')
 project(":ignite-client").projectDir = file('modules/client')
 project(":ignite-jdbc").projectDir = file('modules/jdbc')