You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ib...@apache.org on 2022/09/07 14:43:47 UTC

[ignite-3] branch main updated: IGNITE-17485: Gradle build support (#1032)

This is an automated email from the ASF dual-hosted git repository.

ibessonov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new c91f39cd80 IGNITE-17485: Gradle build support (#1032)
c91f39cd80 is described below

commit c91f39cd80dfd143e5ac848486366ad6ed124ce5
Author: Mikhail <Po...@users.noreply.github.com>
AuthorDate: Wed Sep 7 17:43:42 2022 +0300

    IGNITE-17485: Gradle build support (#1032)
    
    * Added initial gradle project structure.
    * Created test fixtures with all shared test classes. (Temporary code duplicate).
    * Extracted all dependencies to toml.
    * Temporary disabled flaky tests and Windows broken tests. (IGNITE-17601)
---
 .gitignore                                         |  12 +-
 build.gradle                                       |  87 ++++++++
 buildscripts/java-core.gradle                      | 115 ++++++++++
 buildscripts/java-integration-test.gradle          |  65 ++++++
 .../java-junit5.gradle                             |  23 +-
 .../java-library.gradle                            |  16 +-
 .../java-test-fixtures.gradle                      |  17 +-
 .../publishing-repos.gradle                        |  22 +-
 .../publishing.gradle                              |  18 +-
 .../LICENSE.txt                                    |  16 +-
 .../build.gradle                                   |  21 +-
 gradle.properties                                  |  16 ++
 gradle/libs.versions.toml                          | 225 ++++++++++++++++++++
 gradle/wrapper/gradle-wrapper.jar                  | Bin 0 -> 59821 bytes
 gradle/wrapper/gradle-wrapper.properties           |   5 +
 gradlew                                            | 234 +++++++++++++++++++++
 gradlew.bat                                        |  89 ++++++++
 .../TestOuterObject.java => affinity/build.gradle} |  34 ++-
 .../SchemaObjectBuilder.java => api/build.gradle}  |  30 +--
 .../build.gradle}                                  |  20 +-
 .../build.gradle}                                  |  18 +-
 .../build.gradle}                                  |  20 +-
 .../build.gradle}                                  |  17 +-
 modules/cli/build.gradle                           | 152 +++++++++++++
 .../build.gradle}                                  |  34 +--
 modules/client-handler/build.gradle                |  48 +++++
 modules/client/build.gradle                        |  53 +++++
 .../org/apache/ignite/client/ClientArchTest.java   |  20 +-
 modules/cluster-management/build.gradle            |  65 ++++++
 .../RocksDbClusterStateStorageManagerTest.java     |   4 +
 .../raft/ConcurrentMapClusterStateStorage.java     |   0
 .../jul/NoOpHandler.java => compute/build.gradle}  |  33 +--
 .../build.gradle}                                  |  32 ++-
 .../build.gradle}                                  |  18 +-
 modules/configuration/build.gradle                 |  60 ++++++
 .../configuration/TestConfigurationChanger.java    |   0
 .../storage/TestConfigurationStorage.java          |   0
 .../testframework/BasicConfigurationSchema.java    |   0
 .../testframework/ConfigurationExtension.java      |   0
 .../testframework/ExtendedConfigurationSchema.java |   0
 .../testframework/InjectConfiguration.java         |   0
 .../InjectRevisionListenerHolder.java              |   0
 .../validation/TestValidationUtil.java             |   0
 modules/core/build.gradle                          |  61 ++++++
 .../testframework/BaseIgniteAbstractTest.java      |   0
 .../internal/testframework/IgniteAbstractTest.java |   0
 .../internal/testframework/IgniteTestUtils.java    |   0
 .../testframework/JunitExtensionTestUtils.java     |   0
 .../testframework/SystemPropertiesExtension.java   |   0
 .../testframework/SystemPropertiesList.java        |   0
 .../testframework/VariableArgumentsProvider.java   |   0
 .../internal/testframework/VariableSource.java     |   0
 .../internal/testframework/WithSystemProperty.java |   0
 .../internal/testframework/WorkDirectory.java      |   0
 .../testframework/WorkDirectoryExtension.java      |   0
 .../internal/testframework/jul/NoOpHandler.java    |   0
 .../matchers/CompletableFutureMatcher.java         |   0
 .../testframework/util/DirectExecutor.java         |   0
 .../build.gradle}                                  |  19 +-
 .../build.gradle}                                  |  19 +-
 .../build.gradle}                                  |  28 ++-
 modules/jacoco-report/build.gradle                 |  57 +++++
 .../build.gradle}                                  |  32 ++-
 modules/metastorage-client/build.gradle            |  40 ++++
 .../build.gradle}                                  |  19 +-
 modules/metastorage-server/build.gradle            |  38 ++++
 .../server/SimpleInMemoryKeyValueStorage.java      |   0
 .../build.gradle}                                  |  29 ++-
 .../build.gradle}                                  |  18 +-
 .../build.gradle}                                  |  32 ++-
 .../build.gradle}                                  |  32 ++-
 modules/network/build.gradle                       |  71 +++++++
 .../TestScaleCubeClusterServiceFactory.java        |   0
 .../ignite/utils/ClusterServiceTestUtils.java      |   0
 modules/page-memory/build.gradle                   |  38 ++++
 .../build.gradle}                                  |  24 ++-
 .../build.gradle}                                  |  21 +-
 modules/raft/build.gradle                          |  60 ++++++
 .../apache/ignite/raft/jraft/core/ItNodeTest.java  |   3 +
 .../apache/ignite/raft/jraft/test/TestUtils.java   |  12 +-
 modules/rest-api/build.gradle                      |  39 ++++
 .../jul/NoOpHandler.java => rest/build.gradle}     |  33 +--
 .../build.gradle}                                  |  19 +-
 modules/runner/build.gradle                        |  94 +++++++++
 modules/schema/build.gradle                        |  51 +++++
 .../ignite/internal/schema/SchemaTestUtils.java    |   0
 .../schema/marshaller/RecordMarshallerTest.java    |   0
 .../schema/testobjects/TestObjectWithAllTypes.java |   0
 .../TestObjectWithNoDefaultConstructor.java        |   0
 .../TestObjectWithPrivateConstructor.java          |   0
 .../schema/testobjects/TestOuterObject.java        |   0
 .../schema/testobjects/TestSimpleObject.java       |   0
 .../testutils/builder/AbstractIndexBuilder.java    |   0
 .../testutils/builder/ColumnDefinitionBuilder.java |   0
 .../builder/ColumnDefinitionBuilderImpl.java       |   0
 .../builder/HashIndexDefinitionBuilder.java        |   0
 .../builder/HashIndexDefinitionBuilderImpl.java    |   0
 .../builder/PrimaryKeyDefinitionBuilder.java       |   0
 .../builder/PrimaryKeyDefinitionBuilderImpl.java   |   0
 .../schema/testutils/builder/SchemaBuilders.java   |   0
 .../testutils/builder/SchemaObjectBuilder.java     |   0
 .../builder/SortedIndexDefinitionBuilder.java      |   0
 .../builder/SortedIndexDefinitionBuilderImpl.java  |   0
 .../testutils/builder/TableDefinitionBuilder.java  |   0
 .../builder/TableDefinitionBuilderImpl.java        |   0
 modules/sql-engine/build.gradle                    | 138 ++++++++++++
 .../sql/engine/exec/rel/ExecutionTest.java         |   3 +
 .../internal/sql/engine/planner/PlannerTest.java   |   3 +
 modules/storage-api/build.gradle                   |  55 +++++
 .../storage/AbstractMvPartitionStorageTest.java    |   0
 .../storage/AbstractMvTableStorageTest.java        |   0
 .../storage/AbstractPartitionStorageTest.java      |   0
 .../internal/storage/BaseMvStoragesTest.java       |   0
 .../TestConcurrentHashMapDataStorageModule.java    |   0
 .../TestConcurrentHashMapMvPartitionStorage.java   |   0
 .../chm/TestConcurrentHashMapMvTableStorage.java   |   0
 .../chm/TestConcurrentHashMapStorageEngine.java    |   0
 ...torageEngineDistributedConfigurationModule.java |   0
 ...rrentHashMapDataStorageConfigurationSchema.java |   0
 .../index/AbstractHashIndexStorageTest.java        |   0
 .../storage/index/impl/BinaryTupleComparator.java  |   0
 .../index/impl/BinaryTupleRowSerializer.java       |   2 +-
 .../internal/storage/index/impl/IndexRowImpl.java  |   0
 .../storage/index/impl/TestHashIndexStorage.java   |   0
 .../storage/index/impl/TestSortedIndexStorage.java |   0
 modules/storage-page-memory/build.gradle           |  47 +++++
 modules/storage-rocksdb/build.gradle               |  45 ++++
 modules/table/build.gradle                         |  66 ++++++
 .../table/ColocationHashCalculationTest.java       |   3 +-
 .../NoOpHandler.java => transactions/build.gradle} |  33 +--
 .../jul/NoOpHandler.java => vault/build.gradle}    |  34 +--
 .../vault/inmemory/InMemoryVaultService.java       |   0
 parent/pom.xml                                     |  17 +-
 settings.gradle                                    | 111 ++++++++++
 134 files changed, 2635 insertions(+), 450 deletions(-)

diff --git a/.gitignore b/.gitignore
index 102454dcb5..2db27b173d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,3 @@
-.idea
-*.iml
 target
 work
 .DS_Store
@@ -9,3 +7,13 @@ work
 .project
 .settings
 
+.gradle
+build/
+!gradle/wrapper/gradle-wrapper.jar
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+out/
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000..cad7582c15
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+repositories {
+    mavenLocal()
+    maven {
+        url = uri('https://repository.apache.org/snapshots')
+    }
+
+    maven {
+        url = uri('https://repo.maven.apache.org/maven2/')
+    }
+}
+
+ext {
+    repos = [
+            'apache-release'   : "https://repo.maven.apache.org/maven2/",
+            'apache-snapshot'  : "https://repository.apache.org/snapshots"
+    ]
+}
+
+allprojects {
+    group 'org.apache.ignite'
+    version = "3.0.0-SNAPSHOT"
+
+    tasks.withType(Test) {
+        defaultCharacterEncoding = 'UTF-8'
+
+        jvmArgs += ["--add-opens=java.base/java.lang=ALL-UNNAMED",
+                "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED",
+                "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
+                "--add-opens=java.base/java.io=ALL-UNNAMED",
+                "--add-opens=java.base/java.nio=ALL-UNNAMED",
+                "--add-opens=java.base/java.math=ALL-UNNAMED",
+                "--add-opens=java.base/java.util=ALL-UNNAMED",
+                "--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED",
+                "-Dio.netty.tryReflectionSetAccessible=true",
+                "-Djava.util.logging.config.file=${project.rootDir}/config/java.util.logging.properties"]
+
+        if (project.hasProperty('excludeTest')) {
+            exclude project.property('excludeTest')
+        }
+    }
+
+    tasks.withType(Javadoc) {
+        options.tags = [ "apiNote" ]
+    }
+
+    tasks.withType(JavaCompile) {
+        options.encoding = 'UTF-8'
+    }
+}
+
+subprojects {
+    apply plugin: 'base'
+
+    repositories {
+        mavenLocal()
+        maven {
+            url = uri('https://repository.apache.org/snapshots')
+            mavenContent {
+                snapshotsOnly()
+            }
+        }
+
+        maven {
+            url = uri('https://repo.maven.apache.org/maven2/')
+            mavenContent {
+                releasesOnly()
+            }
+        }
+    }
+}
diff --git a/buildscripts/java-core.gradle b/buildscripts/java-core.gradle
new file mode 100644
index 0000000000..23deac065e
--- /dev/null
+++ b/buildscripts/java-core.gradle
@@ -0,0 +1,115 @@
+/*
+ * 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 plugin: 'java'
+apply plugin: 'jacoco'
+apply plugin: 'checkstyle'
+apply plugin: 'pmd'
+
+java {
+    sourceCompatibility = JavaVersion.VERSION_11
+    targetCompatibility = JavaVersion.VERSION_11
+    withSourcesJar()
+}
+
+test {
+    finalizedBy(jacocoTestReport)
+}
+
+pmd {
+    ignoreFailures = false
+    consoleOutput = true
+
+    toolVersion = libs.versions.pmdTool.get()
+    ruleSets = []//switch off old rulesets
+}
+
+processResources {
+    filesMatching('**/*.properties') {
+        filter { String line ->
+            line.replace("\${project.version}", project.version)
+        }
+    }
+}
+
+tasks.withType(Pmd) {
+    reports {
+        html {
+            required = true
+        }
+        xml {
+            required = true
+        }
+    }
+}
+
+pmdMain {
+    enabled = false
+    ruleSetFiles = files("$rootDir/check-rules/pmd-rules.xml")
+}
+
+pmdTest {
+    enabled = false
+    ruleSetFiles = files("$rootDir/check-rules/pmd-rules.xml")
+}
+
+
+checkstyle {
+    toolVersion = libs.versions.checkstyleTool.get()
+    ignoreFailures = false
+    showViolations = true
+    maxWarnings = 0
+    configFile = file("$rootDir/check-rules/checkstyle-rules.xml")
+    configProperties.
+    configProperties = [
+            "checkstyle.header.file"      : file("$rootDir/check-rules/LICENSE.txt"),
+            "checkstyle.suppressions.file": file("$rootDir/check-rules/checkstyle-suppressions.xml")
+    ]
+}
+
+tasks.withType(Checkstyle) {
+    enabled false
+    reports {
+        html {
+            required = true
+        }
+        xml {
+            required = true
+        }
+    }
+}
+
+jacoco {
+    toolVersion = libs.versions.jacocoTool.get()
+}
+
+jacocoTestReport {
+    reports {
+        html {
+            required = true
+        }
+        xml {
+            required = true
+        }
+    }
+    afterEvaluate {
+        classDirectories.setFrom(files(classDirectories.files.collect {
+            fileTree(dir: it,
+                    exclude: ['org/apache/calcite/**/*'])
+        }))
+    }
+}
\ No newline at end of file
diff --git a/buildscripts/java-integration-test.gradle b/buildscripts/java-integration-test.gradle
new file mode 100644
index 0000000000..dfb1908045
--- /dev/null
+++ b/buildscripts/java-integration-test.gradle
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ */
+
+sourceSets {
+    integrationTest {
+        compileClasspath += sourceSets.main.output
+        compileClasspath += sourceSets.test.output
+        runtimeClasspath += sourceSets.main.output
+        runtimeClasspath += sourceSets.test.output
+        if (sourceSets.hasProperty("testFixtures")) {
+            compileClasspath += sourceSets.testFixtures.output
+            runtimeClasspath += sourceSets.testFixtures.output
+        }
+    }
+}
+
+pmdIntegrationTest {
+    ruleSetFiles = files("$rootDir/check-rules/pmd-rules.xml")
+    enabled = false
+}
+
+configurations {
+    integrationTestImplementation.extendsFrom implementation
+    integrationTestRuntimeOnly.extendsFrom runtimeOnly
+    integrationTestApi.extendsFrom api
+}
+
+tasks.register('integrationTest', Test) {
+    description = 'Runs integration tests.'
+    group = 'verification'
+
+    testClassesDirs = sourceSets.integrationTest.output.classesDirs
+    classpath = sourceSets.integrationTest.runtimeClasspath
+}
+
+integrationTest {
+    useJUnitPlatform()
+    maxHeapSize = "16g"
+}
+
+dependencies {
+    integrationTestImplementation libs.junit5.api
+    integrationTestImplementation libs.junit5.impl
+    integrationTestImplementation libs.junit5.params
+    integrationTestImplementation libs.mockito.core
+    integrationTestImplementation libs.mockito.junit
+    integrationTestImplementation libs.mockito.inline
+    integrationTestImplementation libs.hamcrest.core
+    integrationTestImplementation libs.hamcrest.optional
+    integrationTestImplementation libs.hamcrest.path
+}
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/buildscripts/java-junit5.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to buildscripts/java-junit5.gradle
index 6d54f754d9..901c25b24c 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/buildscripts/java-junit5.gradle
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
-
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+test {
+    useJUnitPlatform()
+    testLogging {
+        events "passed", "skipped", "failed", "standard_error"
+    }
 }
+
+dependencies {
+    testImplementation libs.junit5.impl
+    testImplementation libs.junit5.api
+    testImplementation libs.junit5.params
+}
\ No newline at end of file
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/buildscripts/java-library.gradle
similarity index 67%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to buildscripts/java-library.gradle
index 6d54f754d9..8113ee8b50 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/buildscripts/java-library.gradle
@@ -14,17 +14,5 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.ignite.internal.configuration.testframework;
-
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
-}
+apply from: "$rootDir/buildscripts/java-core.gradle"
+apply plugin: 'java-library'
\ No newline at end of file
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/buildscripts/java-test-fixtures.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to buildscripts/java-test-fixtures.gradle
index 6d54f754d9..6bf0e5f38e 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/buildscripts/java-test-fixtures.gradle
@@ -15,16 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply plugin: 'java-test-fixtures'
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
-}
+pmdTestFixtures {
+    ruleSetFiles = files("$rootDir/check-rules/pmd-rules.xml")
+    enabled = false
+}
\ No newline at end of file
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/buildscripts/publishing-repos.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to buildscripts/publishing-repos.gradle
index 6d54f754d9..e954f40b7f 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/buildscripts/publishing-repos.gradle
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply plugin: 'maven-publish'
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+publishing {
+  repositories {
+    maven {
+      credentials {
+        username = project.properties["artifactory_user"]
+        password = project.properties["artifactory_pass"]
+      }
+      url repos[project.version.endsWith("-SNAPSHOT") ? 'apache-snapshot' : 'apache-release']
+    }
+  }
 }
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/buildscripts/publishing.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to buildscripts/publishing.gradle
index 6d54f754d9..2180457874 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/buildscripts/publishing.gradle
@@ -15,16 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/publishing-repos.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+publishing {
+  publications {
+    maven(MavenPublication) {
+      from components.java
+    }
+  }
 }
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/check-rules/LICENSE.txt
similarity index 67%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to check-rules/LICENSE.txt
index 6d54f754d9..f974c9ac4f 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/check-rules/LICENSE.txt
@@ -13,18 +13,4 @@
  * 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.configuration.testframework;
-
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
-}
+ */
\ No newline at end of file
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/examples/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to examples/build.gradle
index 6d54f754d9..f17f7c24b6 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/examples/build.gradle
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-runner')
+    implementation project(':ignite-client')
+    implementation project(':ignite-api')
+    testImplementation project(':ignite-core')
+    testImplementation libs.hamcrest.core
 }
+
+description = 'ignite-examples'
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000..86094c8d7a
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,16 @@
+#
+# 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.
+#
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
new file mode 100644
index 0000000000..db380ab318
--- /dev/null
+++ b/gradle/libs.versions.toml
@@ -0,0 +1,225 @@
+#
+# 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.
+#
+
+[versions]
+ivy="2.5.0"
+assertj="3.22.0"
+asm="9.0"
+compileTesting="0.19"
+fliptables="1.1.0"
+jackson="2.13.1"
+jakarta="2.0.0"
+jansi="1.18"
+netty="4.1.70.Final"
+javapoet="1.13.0"
+javax="1.3.2"
+jetbrainsAnnotations="20.1.0"
+jline="3.21.0"
+jmh="1.35"
+junit5="5.8.1"
+jsr305="3.0.2"
+okhttp="4.9.1"
+gson="2.8.9"
+gsonFire="1.8.5"
+threetenbp="1.5.2"
+micronaut="3.5.3"
+micronautPicocli="4.1.0"
+micronautJunit5="3.4.0"
+mockito="4.3.1"
+picocli="4.6.2"
+slf4j="1.7.32"
+spoon="8.4.0-beta-18"
+swagger="2.1.12"
+swaggerLegacy="1.6.4"
+typesafe="1.4.1"
+hamcrest="2.2"
+hamcrestOptional="2.0.0"
+hamcrestPath="1.0.1"
+scalecube="2.6.12"
+calcite="1.30.0"
+value="2.8.8"
+janino="3.1.6"
+avatica="1.20.0"
+jsonpath="2.4.0"
+classgraph="4.8.110"
+javassist="3.28.0-GA"
+geometry="2.2.0"
+checker="3.10.0"
+rocksdb="7.3.1"
+disruptor="3.3.7"
+metrics="4.0.2"
+jctools="3.3.0"
+msgpack="0.8.21"
+caffeine="3.0.4"
+fastutil="8.5.6"
+kryo="4.0.1"
+bytebuddy="1.12.8"
+mockServer="5.13.2"
+archunit="0.23.1"
+testkit="1.8.1"
+openapi="3.2.0"
+
+#Plugins
+rat="0.7.1"
+pmdTool = "6.28.0"
+checkstyleTool = "8.41"
+jacocoTool = "0.8.5"
+
+[plugins]
+openapiGenerator = "org.openapi.generator:5.4.0"
+javacc = "com.intershop.gradle.javacc:4.0.1"
+shadow = "com.github.johnrengelman.shadow:7.1.2"
+cmake = "net.freudasoft.gradle-cmake-plugin:0.0.4"
+
+[libraries]
+assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" }
+
+jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotations" }
+
+hamcrest-core = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" }
+hamcrest-optional = { module = "com.github.npathai:hamcrest-optional", version.ref = "hamcrestOptional" }
+hamcrest-path = { module = "ca.seinesoftware:hamcrest-path", version.ref = "hamcrestPath" }
+
+mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" }
+mockito-junit = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" }
+mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockito" }
+
+asm-core = { module = "org.ow2.asm:asm", version.ref = "asm" }
+asm-tree = { module = "org.ow2.asm:asm-tree", version.ref = "asm" }
+asm-util = { module = "org.ow2.asm:asm-util", version.ref = "asm" }
+
+fliptables = { module = "com.jakewharton.fliptables:fliptables", version.ref = "fliptables" }
+
+jline-core = { module = "org.jline:jline", version.ref = "jline" }
+jline-console = { module = "org.jline:jline-console", version.ref = "jline" }
+
+#JUnit
+junit5-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit5" }
+junit5-impl = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit5" }
+junit5-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit5" }
+junit-testkit = { module = "org.junit.platform:junit-platform-testkit", version.ref = "testkit" }
+
+#Micronaut
+micronaut-inject = { module = "io.micronaut:micronaut-inject", version.ref = "micronaut" }
+micronaut-runtime = { module = "io.micronaut:micronaut-runtime", version.ref = "micronaut" }
+micronaut-validation = { module = "io.micronaut:micronaut-validation", version.ref = "micronaut" }
+micronaut-http-core = { module = "io.micronaut:micronaut-http", version.ref = "micronaut" }
+micronaut-http-server-core = { module = "io.micronaut:micronaut-http-server", version.ref = "micronaut" }
+micronaut-http-client = { module = "io.micronaut:micronaut-http-client", version.ref = "micronaut" }
+micronaut-http-server-netty = { module = "io.micronaut:micronaut-http-server-netty", version.ref = "micronaut" }
+micronaut-openapi = { module = "io.micronaut.openapi:micronaut-openapi", version.ref = "openapi" }
+micronaut-picocli = { module = "io.micronaut.picocli:micronaut-picocli", version.ref = "micronautPicocli" }
+micronaut-junit5 = { module = "io.micronaut.test:micronaut-test-junit5", version.ref = "micronautJunit5" }
+micronaut-test = { module = "io.micronaut.test:micronaut-test-core", version.ref = "micronautJunit5" }
+micronaut-inject-annotation-processor = { module = "io.micronaut:micronaut-inject-java", version.ref = "micronaut" }
+micronaut-validation-annotation-processor = { module = "io.micronaut:micronaut-validation", version.ref = "micronaut" }
+
+picocli-shell-jline3 = { module = "info.picocli:picocli-shell-jline3", version.ref = "picocli" }
+picocli-core = { module = "info.picocli:picocli", version.ref = "picocli" }
+picocli-annotation-processor = { module = "info.picocli:picocli-codegen", version.ref = "picocli" }
+
+jansi-core = { module = "org.fusesource.jansi:jansi", version.ref = "jansi" }
+
+jackson-core = { module = "com.fasterxml.jackson.core:jackson-core", version = "jackson" }
+jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson" }
+jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations", version.ref = "jackson" }
+
+apache-ivy = { module = "org.apache.ivy:ivy", version.ref = "ivy" }
+
+typesafe-config = { module = "com.typesafe:config", version.ref = "typesafe" }
+slf4j-jdk14 = { module = "org.slf4j:slf4j-jdk14", version.ref = "slf4j" }
+
+gson-core = { module = "com.google.code.gson:gson", version.ref = "gson" }
+gson-fire = { module = "io.gsonfire:gson-fire", version.ref = "gsonFire" }
+
+jsr305 = { module = "com.google.code.findbugs:jsr305", version.ref = "jsr305" }
+
+okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
+okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" }
+
+threetenbp = { module = "org.threeten:threetenbp", version.ref = "threetenbp" }
+
+swaggerv3-annotations = { module = "io.swagger.core.v3:swagger-annotations", version.ref = "swagger" }
+swagger-legacy-annotations = { module = "io.swagger:swagger-annotations", version.ref = "swaggerLegacy" }
+
+mock-server-netty = { module = "org.mock-server:mockserver-netty", version.ref = "mockServer" }
+mock-server-junit = { module = "org.mock-server:mockserver-junit-jupiter", version.ref = "mockServer" }
+
+msgpack-core = { module = "org.msgpack:msgpack-core", version.ref = "msgpack" }
+msgpack-jackson = { module = "org.msgpack:jackson-dataformat-msgpack", version.ref = "msgpack" }
+
+netty-common = { module = "io.netty:netty-common", version.ref = "netty" }
+netty-buffer = { module = "io.netty:netty-buffer", version.ref = "netty" }
+netty-codec = { module = "io.netty:netty-codec", version.ref = "netty" }
+netty-handler = { module = "io.netty:netty-handler", version.ref = "netty" }
+netty-transport = { module = "io.netty:netty-transport", version.ref = "netty" }
+
+archunit-core = { module = "com.tngtech.archunit:archunit", version.ref = "archunit" }
+archunit-junit5 = { module = "com.tngtech.archunit:archunit-junit5", version.ref = "archunit" }
+
+jmh-core = { module = "org.openjdk.jmh:jmh-core", version.ref = "jmh" }
+jmh-annotation-processor = { module = "org.openjdk.jmh:jmh-generator-annprocess", version.ref = "jmh" }
+
+classgraph = { module = "io.github.classgraph:classgraph", version.ref = "classgraph" }
+
+javapoet = { module = "com.squareup:javapoet", version.ref = "javapoet" }
+
+compileTesting = { module = "com.google.testing.compile:compile-testing", version.ref = "compileTesting" }
+
+spoon-core = { module = "fr.inria.gforge.spoon:spoon-core", version.ref = "spoon" }
+
+fastutil-core = { module = "it.unimi.dsi:fastutil-core", version.ref = "fastutil" }
+
+scalecube-cluster = { module = "io.scalecube:scalecube-cluster", version.ref = "scalecube" }
+
+kryo = { module = "com.esotericsoftware:kryo", version.ref = "kryo" }
+
+bytebuddy = { module = "net.bytebuddy:byte-buddy", version.ref = "bytebuddy" }
+
+disruptor = { module = "com.lmax:disruptor", version.ref = "disruptor" }
+
+rocksdb-jni = { module = "org.rocksdb:rocksdbjni", version.ref = "rocksdb" }
+
+dropwizard-metrics = { module = "io.dropwizard.metrics:metrics-core", version.ref = "metrics" }
+
+jctools-core = { module = "org.jctools:jctools-core", version.ref = "jctools" }
+
+jakarta-annotations = { module = "jakarta.annotation:jakarta.annotation-api", version.ref = "jakarta" }
+jakarta-inject = { module = "jakarta.inject:jakarta.inject-api", version.ref = "jakarta" }
+
+jsonpath-core = { module = "com.jayway.jsonpath:json-path", version.ref = "jsonpath" }
+jsonpath-assert = { module = "com.jayway.jsonpath:json-path-assert", version.ref = "jsonpath" }
+
+javax-annotations = { module = "javax.annotation:javax.annotation-api", version.ref = "javax" }
+
+caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "caffeine" }
+
+calcite-core = { module = "org.apache.calcite:calcite-core", version.ref = "calcite" }
+calcite-linq4j = { module = "org.apache.calcite:calcite-linq4j", version.ref = "calcite" }
+calcite-avatica = { module = "org.apache.calcite.avatica:avatica-core", version.ref = "avatica" }
+
+value-annotations = { module = "org.immutables:value-annotations", version.ref = "value" }
+value-annotation-processor = { module = "org.immutables:value", version.ref = "value" }
+
+janino-core = { module = "org.codehaus.janino:janino", version.ref = "janino" }
+janino-compiler = { module = "org.codehaus.janino:commons-compiler", version.ref = "janino" }
+
+javassist = { module = "org.javassist:javassist", version.ref = "javassist" }
+
+esri-geometry = { module = "com.esri.geometry:esri-geometry-api", version.ref = "geometry" }
+
+checker-qual = { module = "org.checkerframework:checker-qual", version.ref = "checker" }
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..41d9927a4d
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..41dfb87909
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000000..1b6c787337
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,234 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed 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
+#
+#      https://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.
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000..107acd32c4
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java b/modules/affinity/build.gradle
similarity index 58%
copy from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
copy to modules/affinity/build.gradle
index f27ee2d52a..5e802205f0 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
+++ b/modules/affinity/build.gradle
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.testobjects;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-/**
- * Test object.
- */
-public class TestOuterObject {
-    private long id;
-
-    /**
-     * Inner class.
-     */
-    @SuppressWarnings("InnerClassMayBeStatic")
-    public class InnerObject {
-        private long id1;
-    }
+dependencies {
+    implementation project(':ignite-raft')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-metastorage')
+    implementation project(':ignite-api')
+    implementation project(':ignite-baseline')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
 
-    /**
-     * Nested class.
-     */
-    public static class NestedObject {
-        private long id2;
-    }
+    testImplementation project(':ignite-configuration')
+    testImplementation libs.mockito.core
 }
+
+description = 'ignite-affinity'
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java b/modules/api/build.gradle
similarity index 64%
copy from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
copy to modules/api/build.gradle
index 31e923d641..f2a3e00ade 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
+++ b/modules/api/build.gradle
@@ -15,26 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.testutils.builder;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.Map;
 
-/**
- * Builder base interface.
- */
-public interface SchemaObjectBuilder {
-    /**
-     * Provide hints to a builder.
-     *
-     * @param hints Hints.
-     * @return {@code This} for chaining.
-     */
-    SchemaObjectBuilder withHints(Map<String, String> hints);
+dependencies {
+    annotationProcessor project(":ignite-configuration-annotation-processor")
+    api project(':ignite-configuration-api')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
 
-    /**
-     * Builds schema object.
-     *
-     * @return Built object.
-     */
-    Object build();
+    testImplementation libs.hamcrest.core
+    testImplementation libs.hamcrest.optional
 }
+
+description = 'ignite-api'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/baseline/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/baseline/build.gradle
index 6d54f754d9..53fb2752f6 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/baseline/build.gradle
@@ -15,16 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-network-api')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-metastorage')
+    implementation project(':ignite-core')
 }
+
+description = 'ignite-baseline'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/binary-tuple/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/binary-tuple/build.gradle
index 6d54f754d9..369c81b92b 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/binary-tuple/build.gradle
@@ -15,16 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
+description = 'ignite-binary-tuple'
 
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
 }
+
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/bytecode/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/bytecode/build.gradle
index 6d54f754d9..8cb6b91b86 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/bytecode/build.gradle
@@ -15,16 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation libs.jetbrains.annotations
+    api libs.asm.core
+    api libs.asm.tree
+    api libs.asm.util
 }
+
+description = 'ignite-bytecode'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/cli-common/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/cli-common/build.gradle
index 6d54f754d9..ea365df4a5 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/cli-common/build.gradle
@@ -15,16 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation libs.picocli.core
 }
+
+description = 'ignite-cli-common'
diff --git a/modules/cli/build.gradle b/modules/cli/build.gradle
new file mode 100644
index 0000000000..ba120657f8
--- /dev/null
+++ b/modules/cli/build.gradle
@@ -0,0 +1,152 @@
+/*
+ * 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.
+ */
+
+import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
+
+plugins {
+    alias(libs.plugins.openapiGenerator)
+    id 'idea'
+    id 'application'
+}
+
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+
+description = 'ignite-cli'
+
+dependencies {
+    annotationProcessor libs.picocli.annotation.processor
+    annotationProcessor libs.micronaut.inject.annotation.processor
+    annotationProcessor libs.micronaut.validation.annotation.processor
+
+    implementation project(':ignite-cli-common')
+    implementation project(':ignite-core')
+    implementation project(':ignite-api')
+    implementation project(':ignite-client')
+
+    implementation libs.fliptables
+    implementation libs.jline.core
+    implementation libs.jline.console
+    implementation libs.micronaut.inject
+    implementation libs.micronaut.validation
+    implementation libs.micronaut.runtime
+    implementation libs.micronaut.picocli
+    implementation libs.jansi.core
+    implementation libs.picocli.shell.jline3
+    implementation libs.picocli.core
+    implementation libs.jackson.databind
+    implementation libs.apache.ivy
+    implementation libs.typesafe.config
+    implementation libs.slf4j.jdk14
+    implementation libs.gson.core
+    implementation libs.gson.fire
+    implementation libs.jsr305
+    implementation libs.okhttp.core
+    implementation libs.okhttp.logging
+    implementation libs.threetenbp
+    implementation libs.swagger.legacy.annotations
+
+    testAnnotationProcessor libs.picocli.annotation.processor
+    testAnnotationProcessor libs.micronaut.inject.annotation.processor
+    testAnnotationProcessor libs.micronaut.validation.annotation.processor
+
+    testImplementation project(':ignite-runner')
+    testImplementation project(':ignite-schema')
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-sql-engine')
+    testImplementation(testFixtures(project(":ignite-core")))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.hamcrest.optional
+    testImplementation libs.mockito.junit
+    testImplementation libs.micronaut.junit5
+    testImplementation libs.micronaut.test
+    testImplementation libs.assertj.core
+    testImplementation libs.mock.server.netty
+    testImplementation libs.mock.server.junit
+
+    integrationTestAnnotationProcessor libs.micronaut.inject.annotation.processor
+    integrationTestImplementation project(':ignite-runner')
+    integrationTestImplementation project(':ignite-schema')
+    integrationTestImplementation project(':ignite-sql-engine')
+    integrationTestImplementation(testFixtures(project(":ignite-core")))
+    integrationTestImplementation(testFixtures(project(":ignite-schema")))
+    integrationTestImplementation libs.mock.server.netty
+    integrationTestImplementation libs.mock.server.junit
+    integrationTestImplementation libs.micronaut.junit5
+    integrationTestImplementation libs.micronaut.test
+    integrationTestImplementation libs.assertj.core
+}
+
+ext.generatedClientDir = layout.buildDirectory.dir("swagger/client")
+
+task copyOpenapiDefinition(type: Copy) {
+    from("$rootDir/modules/rest/openapi")
+    into("$buildDir/customOpenapiDefinition/")
+}
+
+task generateApiClient(type: GenerateTask) {
+    generatorName="java"
+    inputs.dir file("$buildDir/customOpenapiDefinition/")
+    inputSpec="$buildDir/customOpenapiDefinition/openapi.yaml"
+    apiPackage="org.apache.ignite.rest.client.api"
+    invokerPackage="org.apache.ignite.rest.client.invoker"
+    modelPackage="org.apache.ignite.rest.client.model"
+    outputDir = generatedClientDir.get().asFile.toString()
+    generateModelTests=false
+    generateApiTests=false
+    languageSpecificPrimitives=["boolean", "int", "float", "double", "char", "byte", "short", "long"]
+    configOptions = [
+        "openApiNullable": "false",
+        "supportStreaming": "false",
+        "library": "okhttp-gson"
+    ]
+}
+
+generateApiClient.dependsOn copyOpenapiDefinition
+
+task generateAutocompletionScript(type: JavaExec) {
+    classpath = sourceSets.main.runtimeClasspath
+    mainClass.set("picocli.AutoComplete")
+    systemProperty("picocli.autocomplete.systemExitOnError", "")
+    args = ["--force",
+            "--completionScript",
+            "${buildDir}/ignite_completion.sh",
+            "-n",
+            "ignite",
+            "org.apache.ignite.cli.commands.TopLevelCliCommand"]
+}
+
+build.dependsOn generateAutocompletionScript
+
+application {
+    mainClass = 'org.apache.ignite.cli.Main'
+}
+
+idea.module {
+    sourceDirs += generatedClientDir.get().dir('src/main/java').asFile
+    resourceDirs += generatedClientDir.get().dir('src/main/resources').asFile
+    generatedSourceDirs += generatedClientDir.get().dir('src/main/java').asFile
+    resourceDirs += sourceSets.main.output.resourcesDir
+}
+
+compileJava {
+    dependsOn generateApiClient
+    source generatedClientDir.get().dir('src/main/java')
+}
+
+
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java b/modules/client-common/build.gradle
similarity index 52%
copy from modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
copy to modules/client-common/build.gradle
index 48afbfbae8..99e2192335 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
+++ b/modules/client-common/build.gradle
@@ -15,22 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.testframework.jul;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.logging.Handler;
-import java.util.logging.LogRecord;
+dependencies {
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    implementation libs.msgpack.core
+    implementation libs.msgpack.jackson
+    implementation libs.netty.common
+    implementation libs.netty.buffer
+    implementation libs.netty.codec
 
-/**
- * Adapter for {@link Handler} with empty implementations of all methods but {@link Handler#publish(LogRecord)}.
- */
-public abstract class NoOpHandler extends Handler {
-    @Override
-    public void flush() {
-        // no-op
-    }
-
-    @Override
-    public void close() throws SecurityException {
-        // no-op
-    }
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.mockito.junit
+    testImplementation libs.hamcrest.core
+    testImplementation libs.jmh.core
+    testImplementation libs.jmh.annotation.processor
 }
+
+description = 'ignite-client-common'
diff --git a/modules/client-handler/build.gradle b/modules/client-handler/build.gradle
new file mode 100644
index 0000000000..1b075b7c51
--- /dev/null
+++ b/modules/client-handler/build.gradle
@@ -0,0 +1,48 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+
+dependencies {
+    implementation project(':ignite-client-common')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-api')
+    implementation project(':ignite-table')
+    implementation project(':ignite-sql-engine')
+    implementation project(':ignite-network')
+    implementation project(':ignite-core')
+    implementation project(':ignite-extended-api')
+    implementation project(':ignite-schema')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    implementation libs.slf4j.jdk14
+    implementation libs.netty.common
+    implementation libs.netty.buffer
+    implementation libs.netty.codec
+    implementation libs.netty.handler
+    implementation libs.msgpack.core
+    implementation libs.msgpack.jackson
+    testImplementation project(':ignite-configuration')
+    testImplementation libs.mockito.junit
+    testImplementation libs.hamcrest.core
+
+    integrationTestImplementation(testFixtures(project(':ignite-configuration')))
+}
+
+description = 'ignite-client-handler'
diff --git a/modules/client/build.gradle b/modules/client/build.gradle
new file mode 100644
index 0000000000..43f0fe47e6
--- /dev/null
+++ b/modules/client/build.gradle
@@ -0,0 +1,53 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    api project(':ignite-client-common')
+    implementation project(':ignite-marshaller-common')
+
+    implementation libs.jetbrains.annotations
+    implementation libs.msgpack.core
+    implementation libs.msgpack.jackson
+    implementation libs.netty.common
+    implementation libs.netty.buffer
+    implementation libs.netty.codec
+
+    testImplementation libs.jetbrains.annotations
+    testImplementation project(':ignite-client-handler')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-sql-engine')
+    testImplementation project(':ignite-schema')
+    testImplementation project(':ignite-table')
+    testImplementation project(':ignite-network')
+    testImplementation project(':ignite-raft-client')
+    testImplementation project(':ignite-transactions')
+    testImplementation project(':ignite-storage-api')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.junit5.params
+    testImplementation libs.mockito.junit
+    testImplementation libs.archunit.core
+    testImplementation libs.archunit.junit5
+}
+
+description = 'ignite-client'
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java
index 4f5e1e16ad..19f664a3f6 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java
@@ -25,6 +25,7 @@ import com.tngtech.archunit.junit.LocationProvider;
 import com.tngtech.archunit.lang.ArchRule;
 import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.HashSet;
 import java.util.Set;
@@ -48,13 +49,9 @@ public class ClientArchTest {
             var locations = new HashSet<Location>();
 
             // both target/classes and target/libs defines a runtime scope of this particular module
-            locations.add(Location.of(Paths.get("target", "classes")));
+            locations.add(Location.of(directoryFromBuildDir("classes")));
 
-            var libDir = Paths.get("target", "libs").toFile();
-
-            if (!libDir.exists()) {
-                throw new AssertionError("Expect \"libs\" directory to exist. Try to run 'mvn clean install'");
-            }
+            var libDir = directoryFromBuildDir("libs").toFile();
 
             for (var lib : libDir.listFiles()) {
                 if (!lib.getName().endsWith(".jar")) {
@@ -70,6 +67,17 @@ public class ClientArchTest {
 
             return locations;
         }
+
+        private static Path directoryFromBuildDir(String folder) {
+            Path path = Paths.get("target", folder);
+            if (!path.toFile().exists()) {
+                path = Paths.get("build", folder);
+            }
+            if (!path.toFile().exists()) {
+                throw new AssertionError("Expect " + folder + " directory to exist.");
+            }
+            return path;
+        }
     }
 
     @ArchTest
diff --git a/modules/cluster-management/build.gradle b/modules/cluster-management/build.gradle
new file mode 100644
index 0000000000..0cf2af3fb4
--- /dev/null
+++ b/modules/cluster-management/build.gradle
@@ -0,0 +1,65 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+
+description = 'ignite-cluster-management'
+
+dependencies {
+    annotationProcessor project(":ignite-network-annotation-processor")
+    annotationProcessor libs.micronaut.inject.annotation.processor
+
+    implementation project(':ignite-core')
+    implementation project(':ignite-network')
+    implementation project(':ignite-raft')
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-vault')
+    implementation project(':ignite-rocksdb-common')
+    implementation project(':ignite-rest-api')
+    implementation libs.jetbrains.annotations
+    implementation libs.micronaut.http.core
+    implementation libs.micronaut.http.server.core
+    implementation libs.fastutil.core
+
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation project(':ignite-network')
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.junit
+    testImplementation libs.classgraph
+    testImplementation libs.slf4j.jdk14
+    testImplementation libs.micronaut.test
+    testImplementation libs.micronaut.http.client
+    testImplementation libs.micronaut.http.server.netty
+
+    testFixturesImplementation project(':ignite-core')
+    testFixturesImplementation libs.jetbrains.annotations
+
+    integrationTestAnnotationProcessor libs.micronaut.inject.annotation.processor
+    integrationTestImplementation(testFixtures(project(':ignite-core')))
+    integrationTestImplementation(testFixtures(project(':ignite-network')))
+    integrationTestImplementation libs.micronaut.junit5
+
+    integrationTestImplementation libs.micronaut.test
+    integrationTestImplementation libs.micronaut.http.client
+    integrationTestImplementation libs.micronaut.http.server.netty
+}
+
diff --git a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorageManagerTest.java b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorageManagerTest.java
index 5b3cf7f4b0..9153ccc674 100644
--- a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorageManagerTest.java
+++ b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorageManagerTest.java
@@ -17,9 +17,13 @@
 
 package org.apache.ignite.internal.cluster.management.raft;
 
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
 /**
  * Tests for {@link RaftStorageManager} based on {@link RocksDbClusterStateStorage}.
  */
+@DisabledOnOs(value = OS.WINDOWS, disabledReason = "https://issues.apache.org/jira/browse/IGNITE-17601")
 public class RocksDbClusterStateStorageManagerTest extends AbstractClusterStateStorageManagerTest {
     @Override
     ClusterStateStorage clusterStateStorage() {
diff --git a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/ConcurrentMapClusterStateStorage.java b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/raft/ConcurrentMapClusterStateStorage.java
similarity index 100%
rename from modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/ConcurrentMapClusterStateStorage.java
rename to modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/raft/ConcurrentMapClusterStateStorage.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java b/modules/compute/build.gradle
similarity index 52%
copy from modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
copy to modules/compute/build.gradle
index 48afbfbae8..e304ed2c10 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
+++ b/modules/compute/build.gradle
@@ -15,22 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.testframework.jul;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.logging.Handler;
-import java.util.logging.LogRecord;
+dependencies {
+    implementation project(':ignite-api')
+    implementation project(':ignite-network')
+    implementation project(':ignite-table')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    annotationProcessor project(':ignite-network-annotation-processor')
 
-/**
- * Adapter for {@link Handler} with empty implementations of all methods but {@link Handler#publish(LogRecord)}.
- */
-public abstract class NoOpHandler extends Handler {
-    @Override
-    public void flush() {
-        // no-op
-    }
-
-    @Override
-    public void close() throws SecurityException {
-        // no-op
-    }
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.core
+    testImplementation libs.mockito.junit
 }
+
+description = 'ignite-compute'
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java b/modules/configuration-annotation-processor/build.gradle
similarity index 62%
copy from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
copy to modules/configuration-annotation-processor/build.gradle
index 31e923d641..a7f7df2f2e 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
+++ b/modules/configuration-annotation-processor/build.gradle
@@ -15,26 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.testutils.builder;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.Map;
+dependencies {
+    implementation project(':ignite-configuration-api')
+    implementation project(':ignite-core')
+    implementation libs.javapoet
+    implementation libs.jetbrains.annotations
 
-/**
- * Builder base interface.
- */
-public interface SchemaObjectBuilder {
-    /**
-     * Provide hints to a builder.
-     *
-     * @param hints Hints.
-     * @return {@code This} for chaining.
-     */
-    SchemaObjectBuilder withHints(Map<String, String> hints);
-
-    /**
-     * Builds schema object.
-     *
-     * @return Built object.
-     */
-    Object build();
+    testImplementation libs.compileTesting
+    testImplementation libs.hamcrest.core
+    testImplementation libs.spoon.core
 }
+
+description = 'ignite-configuration-annotation-processor'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/configuration-api/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/configuration-api/build.gradle
index 6d54f754d9..60a7f953c3 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/configuration-api/build.gradle
@@ -15,16 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
 }
+
+description = 'ignite-configuration-api'
diff --git a/modules/configuration/build.gradle b/modules/configuration/build.gradle
new file mode 100644
index 0000000000..147b5b1b8a
--- /dev/null
+++ b/modules/configuration/build.gradle
@@ -0,0 +1,60 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+
+description = 'ignite-configuration'
+
+dependencies {
+    api project(':ignite-configuration-api')
+    implementation project(':ignite-bytecode')
+    implementation project(':ignite-api')
+    implementation project(':ignite-rest-api')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    implementation libs.asm.core
+    implementation libs.micronaut.http.core
+    implementation libs.micronaut.http.server.core
+    implementation libs.typesafe.config
+
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+    annotationProcessor libs.micronaut.inject.annotation.processor
+
+    testAnnotationProcessor project(':ignite-configuration-annotation-processor')
+    testAnnotationProcessor libs.micronaut.inject.annotation.processor
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-rest-api')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.junit5.api
+    testImplementation libs.junit5.params
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.core
+    testImplementation libs.micronaut.test
+    testImplementation libs.micronaut.junit5
+    testImplementation libs.micronaut.http.client
+    testImplementation libs.micronaut.http.server.netty
+
+    testFixturesAnnotationProcessor project(':ignite-configuration-annotation-processor')
+    testFixturesImplementation libs.jetbrains.annotations
+    testFixturesImplementation libs.junit5.api
+    testFixturesImplementation libs.mockito.core
+    testFixturesImplementation libs.typesafe.config
+    testFixturesImplementation libs.hamcrest.core
+}
+
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
similarity index 100%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ExtendedConfigurationSchema.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ExtendedConfigurationSchema.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ExtendedConfigurationSchema.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ExtendedConfigurationSchema.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/InjectConfiguration.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectConfiguration.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/InjectConfiguration.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectConfiguration.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/TestValidationUtil.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/validation/TestValidationUtil.java
similarity index 100%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/TestValidationUtil.java
rename to modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/validation/TestValidationUtil.java
diff --git a/modules/core/build.gradle b/modules/core/build.gradle
new file mode 100644
index 0000000000..11e386a8a4
--- /dev/null
+++ b/modules/core/build.gradle
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+plugins {
+    alias(libs.plugins.shadow)
+}
+
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+
+description = 'ignite-core'
+
+dependencies {
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    testImplementation libs.hamcrest.core
+    testImplementation libs.junit.testkit
+    testImplementation libs.mockito.core
+    testImplementation libs.mockito.inline
+
+    testFixturesImplementation libs.hamcrest.core
+    testFixturesImplementation libs.mockito.core
+    testFixturesImplementation libs.junit.testkit
+    testFixturesImplementation libs.jetbrains.annotations
+    testFixturesImplementation libs.junit5.api
+    testFixturesImplementation libs.junit5.impl
+    testFixturesImplementation libs.junit5.params
+    testFixturesImplementation libs.mockito.core
+}
+
+test {
+    filter {
+        //Don't run parametrized tests from inner static classes which should not run.
+        excludeTestsMatching "*VariableSourceTest\$*"
+        excludeTestsMatching "*WorkDirectoryExtensionTest\$*"
+    }
+}
+
+shadowJar {
+    archiveAppendix.set('shaded')
+    archiveClassifier.set('')
+
+    minimize()
+
+    relocate('it.unimi.dsi.fastutil', 'it.unimi.dsi.shaded.fastutil')
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/BaseIgniteAbstractTest.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/BaseIgniteAbstractTest.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/BaseIgniteAbstractTest.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/BaseIgniteAbstractTest.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/IgniteAbstractTest.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteAbstractTest.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/IgniteAbstractTest.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteAbstractTest.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/JunitExtensionTestUtils.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/JunitExtensionTestUtils.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/JunitExtensionTestUtils.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/JunitExtensionTestUtils.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/SystemPropertiesExtension.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/SystemPropertiesExtension.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/SystemPropertiesExtension.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/SystemPropertiesExtension.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/SystemPropertiesList.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/SystemPropertiesList.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/SystemPropertiesList.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/SystemPropertiesList.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/VariableArgumentsProvider.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/VariableArgumentsProvider.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/VariableArgumentsProvider.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/VariableArgumentsProvider.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/VariableSource.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/VariableSource.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/VariableSource.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/VariableSource.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/WithSystemProperty.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WithSystemProperty.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/WithSystemProperty.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WithSystemProperty.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/WorkDirectory.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectory.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/WorkDirectory.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectory.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
similarity index 100%
copy from modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
copy to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/matchers/CompletableFutureMatcher.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/matchers/CompletableFutureMatcher.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/matchers/CompletableFutureMatcher.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/matchers/CompletableFutureMatcher.java
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java
similarity index 100%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java
rename to modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/extended-api/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/extended-api/build.gradle
index 6d54f754d9..f81bcf47fc 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/extended-api/build.gradle
@@ -15,16 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-api')
+    annotationProcessor project(":ignite-configuration-annotation-processor")
+    implementation libs.jetbrains.annotations
 }
+
+description = 'ignite-extended-api'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/file-io/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/file-io/build.gradle
index 6d54f754d9..659eb15396 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/file-io/build.gradle
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
+dependencies {
+    implementation project(':ignite-core')
 
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.hamcrest.core
 }
+
+description = 'ignite-file-io'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/index/build.gradle
similarity index 54%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/index/build.gradle
index 6d54f754d9..6ba0421ee2 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/index/build.gradle
@@ -15,16 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    implementation project(':ignite-table')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-extended-api')
+    implementation libs.jetbrains.annotations
+    testImplementation libs.mockito.core
+    testImplementation libs.mockito.inline
+    testImplementation libs.mockito.junit
+    testImplementation libs.hamcrest.core
+    testImplementation libs.slf4j.jdk14
 }
+
+description = 'ignite-index'
diff --git a/modules/jacoco-report/build.gradle b/modules/jacoco-report/build.gradle
new file mode 100644
index 0000000000..78be31ff78
--- /dev/null
+++ b/modules/jacoco-report/build.gradle
@@ -0,0 +1,57 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    implementation project(':ignite-affinity')
+    implementation project(':ignite-api')
+    implementation project(':ignite-baseline')
+    implementation project(':ignite-bytecode')
+    implementation project(':ignite-compute')
+    implementation project(':ignite-sql-engine')
+    implementation project(':ignite-cli')
+    implementation project(':ignite-cli-common')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-configuration-api')
+    implementation project(':ignite-core')
+    implementation project(':ignite-metastorage')
+    implementation project(':ignite-metastorage-client')
+    implementation project(':ignite-metastorage-common')
+    implementation project(':ignite-metastorage-server')
+    implementation project(':ignite-network')
+    implementation project(':ignite-network-api')
+    implementation project(':ignite-raft')
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-rest')
+    implementation project(':ignite-rocksdb-common')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-storage-api')
+    implementation project(':ignite-storage-rocksdb')
+    implementation project(':ignite-table')
+    implementation project(':ignite-vault')
+    implementation project(':ignite-runner')
+    implementation project(':ignite-transactions')
+    implementation project(':ignite-client-common')
+    implementation project(':ignite-client-handler')
+    implementation project(':ignite-client')
+    implementation project(':ignite-marshaller-common')
+    implementation project(':ignite-page-memory')
+}
+
+description = 'ignite-jacoco-report'
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java b/modules/marshaller-common/build.gradle
similarity index 58%
copy from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
copy to modules/marshaller-common/build.gradle
index f27ee2d52a..5ccc4abdad 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
+++ b/modules/marshaller-common/build.gradle
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.testobjects;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-/**
- * Test object.
- */
-public class TestOuterObject {
-    private long id;
+description = 'ignite-marshaller-common'
 
-    /**
-     * Inner class.
-     */
-    @SuppressWarnings("InnerClassMayBeStatic")
-    public class InnerObject {
-        private long id1;
-    }
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-api')
+    implementation libs.jetbrains.annotations
 
-    /**
-     * Nested class.
-     */
-    public static class NestedObject {
-        private long id2;
-    }
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.junit5.params
+    testImplementation libs.mockito.junit
+    testImplementation libs.jmh.core
+    testImplementation libs.jmh.annotation.processor
 }
diff --git a/modules/metastorage-client/build.gradle b/modules/metastorage-client/build.gradle
new file mode 100644
index 0000000000..710084a00a
--- /dev/null
+++ b/modules/metastorage-client/build.gradle
@@ -0,0 +1,40 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-core')
+    implementation project(':ignite-metastorage-common')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    testImplementation project(':ignite-raft')
+    testImplementation project(':ignite-network')
+    testImplementation project(':ignite-network')
+    testImplementation project(':ignite-metastorage-server')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-raft')
+    testImplementation libs.mockito.junit
+    testImplementation libs.hamcrest.core
+    testImplementation libs.classgraph
+    testImplementation libs.slf4j.jdk14
+}
+
+description = 'ignite-metastorage-client'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/metastorage-common/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/metastorage-common/build.gradle
index 6d54f754d9..7b07bc1b30 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/metastorage-common/build.gradle
@@ -15,16 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
 }
+
+description = 'ignite-metastorage-common'
diff --git a/modules/metastorage-server/build.gradle b/modules/metastorage-server/build.gradle
new file mode 100644
index 0000000000..9dd5a75fad
--- /dev/null
+++ b/modules/metastorage-server/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+
+description = 'ignite-metastorage-server'
+
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-metastorage-common')
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-rocksdb-common')
+    implementation libs.jetbrains.annotations
+
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.mockito.core
+
+    testFixturesImplementation project(':ignite-core')
+    testFixturesImplementation project(':ignite-metastorage-common')
+    testFixturesImplementation libs.jetbrains.annotations
+}
diff --git a/modules/metastorage-server/src/test/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java b/modules/metastorage-server/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
similarity index 100%
rename from modules/metastorage-server/src/test/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
rename to modules/metastorage-server/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/metastorage/build.gradle
similarity index 51%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/metastorage/build.gradle
index 6d54f754d9..6f27d88bf4 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/metastorage/build.gradle
@@ -15,16 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-cluster-management')
+    implementation project(':ignite-network-api')
+    implementation project(':ignite-raft')
+    implementation project(':ignite-vault')
+    api project(':ignite-metastorage-client')
+    api project(':ignite-metastorage-server')
+    api project(':ignite-metastorage-common')
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    testImplementation libs.mockito.junit
 }
+
+description = 'ignite-metastorage'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/metrics/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/metrics/build.gradle
index 6d54f754d9..b89b8941e4 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/metrics/build.gradle
@@ -15,16 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
+dependencies {
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
 
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+    testImplementation libs.hamcrest.core
 }
+
+description = 'ignite-metrics'
\ No newline at end of file
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java b/modules/network-annotation-processor/build.gradle
similarity index 63%
copy from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
copy to modules/network-annotation-processor/build.gradle
index 31e923d641..40cb8071e6 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
+++ b/modules/network-annotation-processor/build.gradle
@@ -15,26 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.testutils.builder;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.Map;
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-network-api')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    implementation libs.javapoet
 
-/**
- * Builder base interface.
- */
-public interface SchemaObjectBuilder {
-    /**
-     * Provide hints to a builder.
-     *
-     * @param hints Hints.
-     * @return {@code This} for chaining.
-     */
-    SchemaObjectBuilder withHints(Map<String, String> hints);
-
-    /**
-     * Builds schema object.
-     *
-     * @return Built object.
-     */
-    Object build();
+    testImplementation libs.mockito.core
+    testImplementation libs.compileTesting
 }
+
+description = 'ignite-network-annotation-processor'
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java b/modules/network-api/build.gradle
similarity index 63%
copy from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
copy to modules/network-api/build.gradle
index 31e923d641..1c83f57066 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
+++ b/modules/network-api/build.gradle
@@ -15,26 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.testutils.builder;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.Map;
+dependencies {
+    api project(':ignite-api')
+    implementation project(':ignite-configuration-api')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
 
-/**
- * Builder base interface.
- */
-public interface SchemaObjectBuilder {
-    /**
-     * Provide hints to a builder.
-     *
-     * @param hints Hints.
-     * @return {@code This} for chaining.
-     */
-    SchemaObjectBuilder withHints(Map<String, String> hints);
-
-    /**
-     * Builds schema object.
-     *
-     * @return Built object.
-     */
-    Object build();
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.core
 }
+
+description = 'ignite-network-api'
diff --git a/modules/network/build.gradle b/modules/network/build.gradle
new file mode 100644
index 0000000000..2d1ec372dd
--- /dev/null
+++ b/modules/network/build.gradle
@@ -0,0 +1,71 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+
+description = 'ignite-network'
+
+dependencies {
+    api project(':ignite-api')
+    api project(':ignite-network-api')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    implementation libs.scalecube.cluster
+    implementation libs.fastutil.core
+    implementation libs.netty.handler
+    implementation libs.netty.transport
+    annotationProcessor project(":ignite-network-annotation-processor")
+    annotationProcessor libs.jmh.annotation.processor
+
+    testAnnotationProcessor project(":ignite-network-annotation-processor")
+    testImplementation project(':ignite-configuration')
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-network-annotation-processor')
+    testImplementation libs.jmh.core
+    testImplementation libs.jmh.annotation.processor
+    testImplementation libs.kryo
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.core
+    testImplementation libs.mockito.junit
+    testImplementation libs.javapoet
+    testImplementation libs.classgraph
+    testImplementation libs.slf4j.jdk14
+    testImplementation libs.bytebuddy
+    testImplementation libs.compileTesting
+
+    testFixturesImplementation project(':ignite-configuration')
+    testFixturesImplementation(testFixtures(project(':ignite-core')))
+    testFixturesImplementation(testFixtures(project(':ignite-configuration')))
+    testFixturesImplementation libs.classgraph
+    testFixturesImplementation libs.scalecube.cluster
+    testFixturesImplementation libs.junit5.api
+
+    integrationTestAnnotationProcessor project(":ignite-network-annotation-processor")
+
+    integrationTestImplementation project(':ignite-network-annotation-processor')
+    integrationTestImplementation(testFixtures(project(':ignite-core')))
+    integrationTestImplementation(testFixtures(project(':ignite-configuration')))
+    integrationTestImplementation libs.compileTesting
+    integrationTestImplementation libs.javapoet
+    integrationTestImplementation libs.classgraph
+}
diff --git a/modules/network/src/integrationTest/java/org/apache/ignite/network/scalecube/TestScaleCubeClusterServiceFactory.java b/modules/network/src/testFixtures/java/org/apache/ignite/network/scalecube/TestScaleCubeClusterServiceFactory.java
similarity index 100%
rename from modules/network/src/integrationTest/java/org/apache/ignite/network/scalecube/TestScaleCubeClusterServiceFactory.java
rename to modules/network/src/testFixtures/java/org/apache/ignite/network/scalecube/TestScaleCubeClusterServiceFactory.java
diff --git a/modules/network/src/integrationTest/java/org/apache/ignite/utils/ClusterServiceTestUtils.java b/modules/network/src/testFixtures/java/org/apache/ignite/utils/ClusterServiceTestUtils.java
similarity index 100%
rename from modules/network/src/integrationTest/java/org/apache/ignite/utils/ClusterServiceTestUtils.java
rename to modules/network/src/testFixtures/java/org/apache/ignite/utils/ClusterServiceTestUtils.java
diff --git a/modules/page-memory/build.gradle b/modules/page-memory/build.gradle
new file mode 100644
index 0000000000..a4a2261379
--- /dev/null
+++ b/modules/page-memory/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-file-io')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation project(':ignite-configuration')
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation libs.mockito.core
+    testImplementation libs.hamcrest.core
+}
+
+description = 'ignite-page-memory'
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/platforms/build.gradle
similarity index 68%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/platforms/build.gradle
index 6d54f754d9..b89ec7297e 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/platforms/build.gradle
@@ -15,16 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+plugins {
+    alias(libs.plugins.cmake)
+}
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
+task copyNativeLibs(type: Copy) {
+    include "**/*.so"
+    from("$rootDir/modules/platforms/cpp")
+    into("$buildDir/classes/")
+}
 
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+cmake {
+    workingFolder=file("$buildDir/cpp")
+    sourceFolder=file("$projectDir/cpp")
+    generator='Unix Makefiles'
+    buildConfig='Release'
+    buildTarget='install'
 }
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/raft-client/build.gradle
similarity index 67%
copy from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
copy to modules/raft-client/build.gradle
index 6d54f754d9..c210042f1e 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/raft-client/build.gradle
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-network-api')
+    implementation libs.jetbrains.annotations
+    testImplementation libs.mockito.junit
+    testImplementation libs.mockito.core
 }
+
+description = 'ignite-raft-client'
diff --git a/modules/raft/build.gradle b/modules/raft/build.gradle
new file mode 100644
index 0000000000..dfa3f97e49
--- /dev/null
+++ b/modules/raft/build.gradle
@@ -0,0 +1,60 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+
+description = 'ignite-raft'
+
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-network')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    implementation libs.disruptor
+    implementation libs.rocksdb.jni
+    implementation libs.dropwizard.metrics
+    implementation libs.jctools.core
+    annotationProcessor project(":ignite-network-annotation-processor")
+    annotationProcessor libs.jmh.annotation.processor
+
+    testAnnotationProcessor project(":ignite-network-annotation-processor")
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-network')))
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-network')
+    testImplementation libs.mockito.junit
+    testImplementation libs.mockito.core
+    testImplementation libs.netty.common
+    testImplementation libs.hamcrest.core
+    testImplementation libs.jmh.core
+    testImplementation libs.classgraph
+    testImplementation libs.slf4j.jdk14
+
+    testFixturesImplementation project(':ignite-core')
+    testFixturesImplementation project(':ignite-network')
+    testFixturesImplementation project(':ignite-raft-client')
+    testFixturesImplementation libs.mockito.core
+    testFixturesImplementation libs.junit5.api
+
+    integrationTestImplementation(testFixtures(project(':ignite-core')))
+    integrationTestImplementation(testFixtures(project(':ignite-network')))
+}
diff --git a/modules/raft/src/integrationTest/java/org/apache/ignite/raft/jraft/core/ItNodeTest.java b/modules/raft/src/integrationTest/java/org/apache/ignite/raft/jraft/core/ItNodeTest.java
index c9a2492eca..8704c5ae95 100644
--- a/modules/raft/src/integrationTest/java/org/apache/ignite/raft/jraft/core/ItNodeTest.java
+++ b/modules/raft/src/integrationTest/java/org/apache/ignite/raft/jraft/core/ItNodeTest.java
@@ -127,6 +127,8 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
@@ -1824,6 +1826,7 @@ public class ItNodeTest {
     }
 
     @Test
+    @DisabledOnOs(value = OS.WINDOWS, disabledReason = "https://issues.apache.org/jira/browse/IGNITE-17601")
     public void testSetPeer2() throws Exception {
         List<PeerId> peers = TestUtils.generatePeers(3);
 
diff --git a/modules/raft/src/test/java/org/apache/ignite/raft/jraft/test/TestUtils.java b/modules/raft/src/testFixtures/java/org/apache/ignite/raft/jraft/test/TestUtils.java
similarity index 95%
rename from modules/raft/src/test/java/org/apache/ignite/raft/jraft/test/TestUtils.java
rename to modules/raft/src/testFixtures/java/org/apache/ignite/raft/jraft/test/TestUtils.java
index 3224fc9e4b..c3b2a89014 100644
--- a/modules/raft/src/test/java/org/apache/ignite/raft/jraft/test/TestUtils.java
+++ b/modules/raft/src/testFixtures/java/org/apache/ignite/raft/jraft/test/TestUtils.java
@@ -115,9 +115,9 @@ public class TestUtils {
 
     public static RpcRequests.PingRequest createPingRequest() {
         return new RaftMessagesFactory()
-            .pingRequest()
-            .sendTimestamp(System.currentTimeMillis())
-            .build();
+                .pingRequest()
+                .sendTimestamp(System.currentTimeMillis())
+                .build();
     }
 
     public static final int INIT_PORT = 5003;
@@ -199,9 +199,9 @@ public class TestUtils {
      */
     public static void assertAllJraftThreadsStopped() {
         assertTrue(waitForCondition(() -> Thread.getAllStackTraces().keySet().stream().
-                noneMatch(t -> t.getName().contains("JRaft")), 5_000),
-            Thread.getAllStackTraces().keySet().stream().filter(t -> t.getName().contains("JRaft")).
-                sorted(comparing(Thread::getName)).collect(toList()).toString());
+                        noneMatch(t -> t.getName().contains("JRaft")), 5_000),
+                Thread.getAllStackTraces().keySet().stream().filter(t -> t.getName().contains("JRaft")).
+                        sorted(comparing(Thread::getName)).collect(toList()).toString());
     }
 
     /**
diff --git a/modules/rest-api/build.gradle b/modules/rest-api/build.gradle
new file mode 100644
index 0000000000..67877b338d
--- /dev/null
+++ b/modules/rest-api/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    annotationProcessor libs.micronaut.inject.annotation.processor
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    implementation project(':ignite-configuration-api')
+    implementation libs.jetbrains.annotations
+    implementation libs.jackson.annotations
+    implementation libs.jackson.databind
+    implementation libs.jakarta.annotations
+    implementation libs.jakarta.inject
+    implementation libs.swaggerv3.annotations
+    implementation libs.micronaut.http.core
+    implementation libs.micronaut.http.server.core
+    testImplementation libs.junit5.api
+    testImplementation libs.mockito.core
+    testImplementation libs.junit5.params
+}
+
+description = 'ignite-rest-api'
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java b/modules/rest/build.gradle
similarity index 50%
copy from modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
copy to modules/rest/build.gradle
index 48afbfbae8..740cfd7833 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
+++ b/modules/rest/build.gradle
@@ -15,22 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.testframework.jul;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.logging.Handler;
-import java.util.logging.LogRecord;
+description = 'ignite-rest'
 
-/**
- * Adapter for {@link Handler} with empty implementations of all methods but {@link Handler#publish(LogRecord)}.
- */
-public abstract class NoOpHandler extends Handler {
-    @Override
-    public void flush() {
-        // no-op
-    }
+dependencies {
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+    annotationProcessor libs.micronaut.inject.annotation.processor
+    annotationProcessor libs.micronaut.openapi
+
+    implementation project(':ignite-api')
+    implementation project(':ignite-rest-api')
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    implementation libs.micronaut.inject
+    implementation libs.micronaut.http.server.netty
+    implementation libs.micronaut.openapi
+    implementation libs.jackson.databind
 
-    @Override
-    public void close() throws SecurityException {
-        // no-op
-    }
+    testImplementation project(':ignite-configuration')
+    testImplementation libs.slf4j.jdk14
 }
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java b/modules/rocksdb-common/build.gradle
similarity index 68%
rename from modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
rename to modules/rocksdb-common/build.gradle
index 6d54f754d9..28947c2c01 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/BasicConfigurationSchema.java
+++ b/modules/rocksdb-common/build.gradle
@@ -15,16 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.configuration.testframework;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
-
-/**
- * Configuration schema for {@link ConfigurationExtensionTest#notifications()}.
- */
-@Config
-public class BasicConfigurationSchema {
-    @Value(hasDefault = true)
-    public int visible = 1;
+dependencies {
+    implementation project(':ignite-core')
+    implementation libs.jetbrains.annotations
+    api libs.rocksdb.jni
 }
+
+description = 'ignite-rocksdb-common'
diff --git a/modules/runner/build.gradle b/modules/runner/build.gradle
new file mode 100644
index 0000000000..0ca1598a60
--- /dev/null
+++ b/modules/runner/build.gradle
@@ -0,0 +1,94 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+
+dependencies {
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+    annotationProcessor libs.micronaut.inject.annotation.processor
+
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-rest')
+    implementation project(':ignite-api')
+    implementation project(':ignite-vault')
+    implementation project(':ignite-network')
+    implementation project(':ignite-raft')
+    implementation project(':ignite-metastorage')
+    implementation project(':ignite-baseline')
+    implementation project(':ignite-affinity')
+    implementation project(':ignite-table')
+    implementation project(':ignite-index')
+    implementation project(':ignite-sql-engine')
+    implementation project(':ignite-client-handler')
+    implementation project(':ignite-compute')
+    implementation project(':ignite-storage-rocksdb')
+    implementation project(':ignite-storage-page-memory')
+    implementation project(':ignite-transactions')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-storage-api')
+    implementation project(':ignite-rest-api')
+    implementation project(':ignite-core')
+    implementation project(':ignite-cluster-management')
+    implementation project(':ignite-metrics')
+    implementation libs.jetbrains.annotations
+    implementation libs.micronaut.inject
+    implementation libs.micronaut.validation
+    implementation libs.micronaut.runtime
+    implementation libs.micronaut.picocli
+    implementation libs.picocli.core
+    implementation libs.slf4j.jdk14
+
+    testAnnotationProcessor project(':ignite-configuration-annotation-processor')
+    testImplementation project(':ignite-cluster-management')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-network')
+    testImplementation project(':ignite-vault')
+    testImplementation project(':ignite-client')
+    testImplementation project(':ignite-metastorage-server')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation(testFixtures(project(':ignite-vault')))
+    testImplementation(testFixtures(project(':ignite-metastorage-server')))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.hamcrest.optional
+    testImplementation libs.hamcrest.path
+    testImplementation libs.mockito.core
+    testImplementation libs.classgraph
+    testImplementation libs.mockito.junit
+    testImplementation libs.jsonpath.assert
+
+    integrationTestAnnotationProcessor project(':ignite-configuration-annotation-processor')
+    integrationTestImplementation project(':ignite-extended-api')
+    integrationTestImplementation project(':ignite-page-memory')
+    integrationTestImplementation project(':ignite-raft-client')
+    integrationTestImplementation project(':ignite-client')
+    integrationTestImplementation(testFixtures(project(':ignite-core')))
+    integrationTestImplementation(testFixtures(project(':ignite-schema')))
+    integrationTestImplementation(testFixtures(project(':ignite-cluster-management')))
+    integrationTestImplementation(testFixtures(project(':ignite-metastorage-server')))
+    integrationTestImplementation(testFixtures(project(':ignite-network')))
+    integrationTestImplementation(testFixtures(project(':ignite-vault')))
+    integrationTestImplementation libs.rocksdb.jni
+    integrationTestImplementation libs.jsonpath.assert
+    integrationTestImplementation libs.typesafe.config
+
+}
+
+description = 'ignite-runner'
diff --git a/modules/schema/build.gradle b/modules/schema/build.gradle
new file mode 100644
index 0000000000..c60dc06b59
--- /dev/null
+++ b/modules/schema/build.gradle
@@ -0,0 +1,51 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+
+description = 'ignite-schema'
+
+dependencies {
+    api project(':ignite-binary-tuple')
+    implementation project(':ignite-api')
+    implementation project(':ignite-bytecode')
+    implementation project(':ignite-core')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-extended-api')
+    implementation libs.jetbrains.annotations
+
+    testAnnotationProcessor project(':ignite-configuration-annotation-processor')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.hamcrest.optional
+    testImplementation libs.mockito.core
+    testImplementation libs.jmh.core
+    testImplementation libs.javax.annotations
+
+    testFixturesImplementation project(':ignite-api')
+    testFixturesImplementation project(':ignite-bytecode')
+    testFixturesImplementation(testFixtures(project(':ignite-core')))
+    testFixturesImplementation libs.jetbrains.annotations
+    testFixturesImplementation libs.junit5.api
+    testFixturesImplementation libs.junit5.impl
+    testFixturesImplementation libs.junit5.params
+}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaTestUtils.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/SchemaTestUtils.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaTestUtils.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/SchemaTestUtils.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/RecordMarshallerTest.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/marshaller/RecordMarshallerTest.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/RecordMarshallerTest.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/marshaller/RecordMarshallerTest.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithAllTypes.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithAllTypes.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithAllTypes.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithAllTypes.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithNoDefaultConstructor.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithNoDefaultConstructor.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithNoDefaultConstructor.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithNoDefaultConstructor.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithPrivateConstructor.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithPrivateConstructor.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithPrivateConstructor.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestObjectWithPrivateConstructor.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestOuterObject.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestSimpleObject.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestSimpleObject.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testobjects/TestSimpleObject.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testobjects/TestSimpleObject.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/AbstractIndexBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/AbstractIndexBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/AbstractIndexBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/AbstractIndexBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaObjectBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java
similarity index 100%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java
diff --git a/modules/sql-engine/build.gradle b/modules/sql-engine/build.gradle
new file mode 100644
index 0000000000..6555ea514c
--- /dev/null
+++ b/modules/sql-engine/build.gradle
@@ -0,0 +1,138 @@
+/*
+ * 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.
+ */
+
+
+import fmpp.setting.Settings
+
+buildscript {
+    dependencies {
+        classpath group: 'net.sourceforge.fmpp', name: 'fmpp', version: '0.9.16'
+    }
+}
+
+plugins {
+    alias(libs.plugins.javacc)
+    id 'idea'
+}
+
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+description = 'ignite-sql-engine'
+
+configurations {
+    calcite
+}
+
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-api')
+    implementation project(':ignite-network')
+    implementation project(':ignite-index')
+    implementation project(':ignite-table')
+    implementation project(':ignite-storage-api')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-transactions')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+    implementation libs.caffeine
+    api libs.calcite.core
+    implementation libs.calcite.linq4j
+    implementation libs.value.annotations
+    implementation libs.janino.compiler
+    implementation libs.janino.core
+    implementation libs.calcite.avatica
+    implementation libs.jackson.core
+    implementation libs.jackson.databind
+    implementation libs.jackson.annotations
+    implementation libs.jsonpath.core
+    implementation libs.classgraph
+    implementation libs.javassist
+    implementation libs.esri.geometry
+    implementation libs.checker.qual
+
+    annotationProcessor project(':ignite-network-annotation-processor')
+    annotationProcessor libs.value.annotation.processor
+
+    testAnnotationProcessor project(':ignite-network-annotation-processor')
+    testAnnotationProcessor libs.value.annotation.processor
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-baseline')
+    testImplementation project(':ignite-extended-api')
+    testImplementation project(':ignite-metastorage')
+    testImplementation project(':ignite-raft')
+    testImplementation project(':ignite-raft-client')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-storage-api')
+    testImplementation project(':ignite-storage-rocksdb')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation(testFixtures(project(':ignite-storage-api')))
+    testImplementation libs.mockito.junit
+    testImplementation libs.mockito.core
+    testImplementation libs.mockito.inline
+    testImplementation libs.hamcrest.core
+    testImplementation libs.slf4j.jdk14
+
+    calcite(libs.calcite.core)
+}
+
+task copyFmppResources(type: Copy) {
+    from("$rootDir/modules/sql-engine/src/main/codegen")
+    into("$buildDir/codegen")
+}
+
+task extractParserTemplate(type: Copy) {
+    from({ zipTree(configurations.calcite.files[0]) }) {
+        include 'codegen/templates/Parser.jj'
+    }
+    into("${buildDir}")
+}
+
+task generateFmppSources() {
+    doLast {
+        Settings settings = new Settings(temporaryDir)
+        settings.set("sourceRoot", file("${buildDir}/codegen/templates").absolutePath)
+        settings.set("outputRoot", file("$buildDir/generated-sources/fmpp").absolutePath)
+
+        settings.load(file("${buildDir}/codegen/config.fmpp"))
+        settings.execute()
+    }
+}
+
+
+javacc {
+    configs {
+        template {
+            inputFile = file("${buildDir}/generated-sources/fmpp/javacc/Parser.jj")
+            outputDir = file("${buildDir}/generated-sources/javacc")
+            packageName = 'org.apache.ignite.internal.generated.query.calcite.sql'
+            lookahead = 2
+            staticParam = false
+        }
+    }
+}
+
+extractParserTemplate.dependsOn copyFmppResources
+generateFmppSources.dependsOn extractParserTemplate
+javaccTemplate.dependsOn generateFmppSources
+compileJava.dependsOn javaccTemplate
+
+idea.module {
+    sourceDirs += file("${buildDir}/generated-sources/javacc")
+}
+
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
index d58d10ff5c..81272a84ae 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
@@ -47,6 +47,8 @@ import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.sql.engine.util.TypeUtils;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -55,6 +57,7 @@ import org.junit.jupiter.params.provider.MethodSource;
  * ExecutionTest.
  * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
  */
+@DisabledOnOs(value = OS.WINDOWS, disabledReason = "https://issues.apache.org/jira/browse/IGNITE-17601")
 public class ExecutionTest extends AbstractExecutionTest {
     @Test
     public void testSimpleExecution() {
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
index d864f2abfb..30088c44f5 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
@@ -65,11 +65,14 @@ import org.apache.ignite.network.ClusterNode;
 import org.jetbrains.annotations.Nullable;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
 
 /**
  * PlannerTest.
  * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
  */
+@DisabledOnOs(value = OS.WINDOWS, disabledReason = "https://issues.apache.org/jira/browse/IGNITE-17601")
 public class PlannerTest extends AbstractPlannerTest {
     private static List<String> NODES;
 
diff --git a/modules/storage-api/build.gradle b/modules/storage-api/build.gradle
new file mode 100644
index 0000000000..94c51ca612
--- /dev/null
+++ b/modules/storage-api/build.gradle
@@ -0,0 +1,55 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+
+dependencies {
+    annotationProcessor project(":ignite-configuration-annotation-processor")
+    implementation project(':ignite-api')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-transactions')
+    implementation project(':ignite-configuration')
+    implementation project(":ignite-core")
+    implementation libs.jetbrains.annotations
+
+    testAnnotationProcessor project(":ignite-configuration-annotation-processor")
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-schema')
+    testImplementation(testFixtures(project(':ignite-schema')))
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.core
+
+    testFixturesAnnotationProcessor project(":ignite-configuration-annotation-processor")
+    testFixturesImplementation project(':ignite-core')
+    testFixturesImplementation(testFixtures(project(':ignite-core')))
+    testFixturesImplementation project(':ignite-configuration')
+    testFixturesImplementation project(':ignite-schema')
+    testFixturesImplementation(testFixtures(project(':ignite-schema')))
+    testFixturesImplementation project(':ignite-transactions')
+    testFixturesImplementation project(':ignite-api')
+    testFixturesImplementation libs.jetbrains.annotations
+    testFixturesImplementation libs.hamcrest.core
+    testFixturesImplementation libs.junit5.api
+    testFixturesImplementation libs.junit5.impl
+}
+
+description = 'ignite-storage-api'
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/AbstractPartitionStorageTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractPartitionStorageTest.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/AbstractPartitionStorageTest.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractPartitionStorageTest.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/BaseMvStoragesTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/BaseMvStoragesTest.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/BaseMvStoragesTest.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/BaseMvStoragesTest.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapDataStorageModule.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapDataStorageModule.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapDataStorageModule.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapDataStorageModule.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvPartitionStorage.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvPartitionStorage.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvPartitionStorage.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvPartitionStorage.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvTableStorage.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvTableStorage.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvTableStorage.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapMvTableStorage.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngine.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngine.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngine.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngine.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngineDistributedConfigurationModule.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngineDistributedConfigurationModule.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngineDistributedConfigurationModule.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/TestConcurrentHashMapStorageEngineDistributedConfigurationModule.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/schema/TestConcurrentHashMapDataStorageConfigurationSchema.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/schema/TestConcurrentHashMapDataStorageConfigurationSchema.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/chm/schema/TestConcurrentHashMapDataStorageConfigurationSchema.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/chm/schema/TestConcurrentHashMapDataStorageConfigurationSchema.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleComparator.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleComparator.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleComparator.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleComparator.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleRowSerializer.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleRowSerializer.java
similarity index 98%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleRowSerializer.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleRowSerializer.java
index 708342dbd9..c74e9313e9 100644
--- a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleRowSerializer.java
+++ b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/BinaryTupleRowSerializer.java
@@ -148,7 +148,7 @@ public class BinaryTupleRowSerializer {
      * @return Builder for chaining.
      */
     private static BinaryTupleBuilder appendValue(BinaryTupleBuilder builder, BinaryTupleSchema schema, Object value) {
-        BinaryTupleSchema.Element element = schema.element(builder.elementIndex());
+        Element element = schema.element(builder.elementIndex());
 
         if (value == null) {
             if (!element.nullable()) {
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/IndexRowImpl.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/IndexRowImpl.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/IndexRowImpl.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/IndexRowImpl.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/TestHashIndexStorage.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/TestHashIndexStorage.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/TestHashIndexStorage.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/TestHashIndexStorage.java
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/TestSortedIndexStorage.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/TestSortedIndexStorage.java
similarity index 100%
rename from modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/impl/TestSortedIndexStorage.java
rename to modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/impl/TestSortedIndexStorage.java
diff --git a/modules/storage-page-memory/build.gradle b/modules/storage-page-memory/build.gradle
new file mode 100644
index 0000000000..5947f04660
--- /dev/null
+++ b/modules/storage-page-memory/build.gradle
@@ -0,0 +1,47 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    implementation project(':ignite-storage-api')
+    implementation project(':ignite-page-memory')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-core')
+    implementation project(':ignite-api')
+    implementation project(':ignite-file-io')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-transactions')
+    implementation libs.jetbrains.annotations
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-storage-api')
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-transactions')
+    testImplementation project(':ignite-storage-api')
+    testImplementation project(':ignite-schema')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation(testFixtures(project(':ignite-storage-api')))
+    testImplementation libs.hamcrest.core
+    testImplementation libs.junit5.params
+    testImplementation libs.mockito.core
+}
+
+description = 'ignite-storage-page-memory'
diff --git a/modules/storage-rocksdb/build.gradle b/modules/storage-rocksdb/build.gradle
new file mode 100644
index 0000000000..1939de8b21
--- /dev/null
+++ b/modules/storage-rocksdb/build.gradle
@@ -0,0 +1,45 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+    implementation project(':ignite-storage-api')
+    implementation project(':ignite-rocksdb-common')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-core')
+    implementation project(':ignite-api')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-transactions')
+    implementation libs.jetbrains.annotations
+
+
+    testAnnotationProcessor project(':ignite-configuration-annotation-processor')
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation project(':ignite-configuration')
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation project(':ignite-storage-api')
+    testImplementation(testFixtures(project(':ignite-storage-api')))
+    testImplementation project(':ignite-schema')
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.core
+}
+
+description = 'ignite-storage-rocksdb'
diff --git a/modules/table/build.gradle b/modules/table/build.gradle
new file mode 100644
index 0000000000..f46cadb7ed
--- /dev/null
+++ b/modules/table/build.gradle
@@ -0,0 +1,66 @@
+/*
+ * 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-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+
+dependencies {
+    annotationProcessor project(':ignite-configuration-annotation-processor')
+    annotationProcessor project(':ignite-network-annotation-processor')
+    implementation project(':ignite-api')
+    implementation project(':ignite-schema')
+    implementation project(':ignite-core')
+    implementation project(':ignite-metastorage')
+    implementation project(':ignite-affinity')
+    implementation project(':ignite-baseline')
+    implementation project(':ignite-network-api')
+    implementation project(':ignite-raft')
+    implementation project(':ignite-raft-client')
+    implementation project(':ignite-metastorage-client')
+    implementation project(':ignite-storage-api')
+    implementation project(':ignite-transactions')
+    implementation project(':ignite-configuration')
+    implementation project(':ignite-extended-api')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
+
+    testImplementation project(':ignite-configuration')
+    testImplementation project(':ignite-storage-api')
+    testImplementation project(':ignite-storage-page-memory')
+    testImplementation project(':ignite-storage-rocksdb')
+    testImplementation project(':ignite-network')
+    testImplementation project(':ignite-core')
+    testImplementation project(':ignite-raft')
+    testImplementation project(':ignite-schema')
+    testImplementation project(':ignite-page-memory')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation(testFixtures(project(':ignite-schema')))
+    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation(testFixtures(project(':ignite-storage-api')))
+    testImplementation(testFixtures(project(':ignite-raft')))
+    testImplementation libs.mockito.core
+    testImplementation libs.mockito.inline
+    testImplementation libs.mockito.junit
+    testImplementation libs.hamcrest.core
+    testImplementation libs.hamcrest.optional
+    testImplementation libs.classgraph
+    testImplementation libs.slf4j.jdk14
+    testImplementation libs.jmh.core
+    testImplementation libs.javax.annotations
+}
+
+description = 'ignite-table'
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/ColocationHashCalculationTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/ColocationHashCalculationTest.java
index 784e29f7e0..cd712a9b8d 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/ColocationHashCalculationTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/ColocationHashCalculationTest.java
@@ -28,7 +28,6 @@ import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.schema.ByteBufferRow;
 import org.apache.ignite.internal.schema.Column;
 import org.apache.ignite.internal.schema.NativeType;
-import org.apache.ignite.internal.schema.RowTest;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.SchemaTestUtils;
 import org.apache.ignite.internal.schema.marshaller.TupleMarshaller;
@@ -57,7 +56,7 @@ public class ColocationHashCalculationTest {
     public void initRandom() {
         long seed = System.currentTimeMillis();
 
-        Loggers.forClass(RowTest.class).info("Using seed: " + seed + "L; //");
+        Loggers.forClass(ColocationHashCalculationTest.class).info("Using seed: " + seed + "L; //");
 
         rnd = new Random(seed);
     }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java b/modules/transactions/build.gradle
similarity index 52%
copy from modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
copy to modules/transactions/build.gradle
index 48afbfbae8..a2d02553ed 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
+++ b/modules/transactions/build.gradle
@@ -15,22 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.testframework.jul;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
-import java.util.logging.Handler;
-import java.util.logging.LogRecord;
+dependencies {
+    annotationProcessor project(":ignite-network-annotation-processor")
+    implementation project(':ignite-api')
+    implementation project(':ignite-core')
+    implementation project(':ignite-network-api')
+    implementation project(':ignite-network')
+    implementation project(':ignite-raft-client')
+    implementation libs.jetbrains.annotations
+    implementation libs.fastutil.core
 
-/**
- * Adapter for {@link Handler} with empty implementations of all methods but {@link Handler#publish(LogRecord)}.
- */
-public abstract class NoOpHandler extends Handler {
-    @Override
-    public void flush() {
-        // no-op
-    }
-
-    @Override
-    public void close() throws SecurityException {
-        // no-op
-    }
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.mockito.junit
+    testImplementation libs.mockito.core
 }
+
+description = 'ignite-transactions'
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java b/modules/vault/build.gradle
similarity index 50%
rename from modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
rename to modules/vault/build.gradle
index 48afbfbae8..7f6c8d5689 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/testframework/jul/NoOpHandler.java
+++ b/modules/vault/build.gradle
@@ -15,22 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.testframework.jul;
+apply from: "$rootDir/buildscripts/java-library.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
 
-import java.util.logging.Handler;
-import java.util.logging.LogRecord;
+dependencies {
+    implementation project(':ignite-core')
+    implementation project(':ignite-rocksdb-common')
+    implementation libs.jetbrains.annotations
+    implementation libs.rocksdb.jni
 
-/**
- * Adapter for {@link Handler} with empty implementations of all methods but {@link Handler#publish(LogRecord)}.
- */
-public abstract class NoOpHandler extends Handler {
-    @Override
-    public void flush() {
-        // no-op
-    }
+    testImplementation project(':ignite-core')
+    testImplementation(testFixtures(project(':ignite-core')))
+    testImplementation libs.hamcrest.core
+
+    testFixturesImplementation project(':ignite-core')
+    testFixturesImplementation libs.jetbrains.annotations
+
+    integrationTestImplementation(testFixtures(project(':ignite-core')))
 
-    @Override
-    public void close() throws SecurityException {
-        // no-op
-    }
 }
+
+description = 'ignite-vault'
diff --git a/modules/vault/src/test/java/org/apache/ignite/internal/vault/inmemory/InMemoryVaultService.java b/modules/vault/src/testFixtures/java/org/apache/ignite/internal/vault/inmemory/InMemoryVaultService.java
similarity index 100%
rename from modules/vault/src/test/java/org/apache/ignite/internal/vault/inmemory/InMemoryVaultService.java
rename to modules/vault/src/testFixtures/java/org/apache/ignite/internal/vault/inmemory/InMemoryVaultService.java
diff --git a/parent/pom.xml b/parent/pom.xml
index 272a0df708..12a007a289 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1424,6 +1424,18 @@
                             </resources>
                         </configuration>
                     </execution>
+                    <execution>
+                        <id>add-test-fixtures</id>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/testFixtures/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
                 </executions>
             </plugin>
 
@@ -1521,7 +1533,7 @@
                     <linkXRef>false</linkXRef>
 
                     <includeTestSourceDirectory>true</includeTestSourceDirectory>
-                    <testSourceDirectories>src/integrationTest/java</testSourceDirectories>
+                    <testSourceDirectories>src/integrationTest/java,src/testFixtures/java</testSourceDirectories>
                 </configuration>
             </plugin>
 
@@ -1591,6 +1603,9 @@
                         <exclude>**/*.bat</exclude> <!-- Files in bat format -->
                         <exclude>**/*.ini</exclude> <!-- Files in ini format -->
                         <exclude>modules/runner/src/integrationTest/sql/**</exclude> <!-- SQL logic tests. -->
+                        <exclude>gradle/**</exclude> <!-- Gradle internal -->
+                        <exclude>gradlew</exclude> <!-- Gradle internal -->
+                        <exclude>gradlew.batc</exclude> <!-- Gradle internal -->
                     </excludes>
                 </configuration>
             </plugin>
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000..1dc1ed7f25
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,111 @@
+/*
+ * 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.
+ */
+
+rootProject.name = 'ignite-parent'
+include(':ignite-page-memory')
+include(':ignite-storage-api')
+include(':ignite-network-annotation-processor')
+include(':ignite-client')
+include(':ignite-rocksdb-common')
+include(':ignite-file-io')
+include(':ignite-vault')
+include(':ignite-rest')
+include(':ignite-examples')
+include(':ignite-network')
+include(':ignite-raft-client')
+include(':ignite-configuration-api')
+include(':ignite-cli-common')
+include(':ignite-raft')
+include(':ignite-schema')
+include(':ignite-storage-page-memory')
+include(':ignite-transactions')
+include(':ignite-client-common')
+include(':ignite-network-api')
+include(':ignite-cluster-management')
+include(':ignite-metastorage-client')
+include(':ignite-metastorage-server')
+include(':ignite-cli')
+include(':ignite-table')
+include(':ignite-api')
+include(':ignite-client-handler')
+include(':ignite-metastorage-common')
+include(':ignite-extended-api')
+include(':ignite-sql-engine')
+include(':ignite-marshaller-common')
+include(':ignite-jacoco-report')
+include(':ignite-configuration')
+include(':ignite-core')
+include(':ignite-affinity')
+include(':ignite-bytecode')
+include(':ignite-runner')
+include(':ignite-index')
+include(':ignite-baseline')
+include(':ignite-metastorage')
+include(':ignite-rest-api')
+include(':ignite-storage-rocksdb')
+include(':ignite-configuration-annotation-processor')
+include(':ignite-compute')
+include(':ignite-metrics')
+include(':ignite-binary-tuple')
+include(':platforms')
+
+project(":ignite-examples").projectDir = file('examples')
+project(":ignite-page-memory").projectDir = file('modules/page-memory')
+project(":ignite-storage-api").projectDir = file('modules/storage-api')
+project(":ignite-network-annotation-processor").projectDir = file('modules/network-annotation-processor')
+project(":ignite-client").projectDir = file('modules/client')
+project(":ignite-rocksdb-common").projectDir = file('modules/rocksdb-common')
+project(":ignite-file-io").projectDir = file('modules/file-io')
+project(":ignite-vault").projectDir = file('modules/vault')
+project(":ignite-rest").projectDir = file('modules/rest')
+project(":ignite-network").projectDir = file('modules/network')
+project(":ignite-raft-client").projectDir = file('modules/raft-client')
+project(":ignite-configuration-api").projectDir = file('modules/configuration-api')
+project(":ignite-cli-common").projectDir = file('modules/cli-common')
+project(":ignite-raft").projectDir = file('modules/raft')
+project(":ignite-schema").projectDir = file('modules/schema')
+project(":ignite-storage-page-memory").projectDir = file('modules/storage-page-memory')
+project(":ignite-transactions").projectDir = file('modules/transactions')
+project(":ignite-client-common").projectDir = file('modules/client-common')
+project(":ignite-network-api").projectDir = file('modules/network-api')
+project(":ignite-cluster-management").projectDir = file('modules/cluster-management')
+project(":ignite-metastorage-client").projectDir = file('modules/metastorage-client')
+project(":ignite-metastorage-server").projectDir = file('modules/metastorage-server')
+project(":ignite-cli").projectDir = file('modules/cli')
+project(":ignite-table").projectDir = file('modules/table')
+project(":ignite-api").projectDir = file('modules/api')
+project(":ignite-client-handler").projectDir = file('modules/client-handler')
+project(":ignite-metastorage-common").projectDir = file('modules/metastorage-common')
+project(":ignite-extended-api").projectDir = file('modules/extended-api')
+project(":ignite-sql-engine").projectDir = file('modules/sql-engine')
+project(":ignite-marshaller-common").projectDir = file('modules/marshaller-common')
+project(":ignite-jacoco-report").projectDir = file('modules/jacoco-report')
+project(":ignite-configuration").projectDir = file('modules/configuration')
+project(":ignite-core").projectDir = file('modules/core')
+project(":ignite-affinity").projectDir = file('modules/affinity')
+project(":ignite-bytecode").projectDir = file('modules/bytecode')
+project(":ignite-runner").projectDir = file('modules/runner')
+project(":ignite-index").projectDir = file('modules/index')
+project(":ignite-baseline").projectDir = file('modules/baseline')
+project(":ignite-metastorage").projectDir = file('modules/metastorage')
+project(":ignite-rest-api").projectDir = file('modules/rest-api')
+project(":ignite-storage-rocksdb").projectDir = file('modules/storage-rocksdb')
+project(":ignite-configuration-annotation-processor").projectDir = file('modules/configuration-annotation-processor')
+project(":ignite-compute").projectDir = file('modules/compute')
+project(":ignite-metrics").projectDir = file('modules/metrics')
+project(":ignite-binary-tuple").projectDir = file('modules/binary-tuple')
+project(":platforms").projectDir = file('modules/platforms')