diff --git a/modules/flink-ext/ignite/README.txt b/modules/flink-ext/ignite/README.txt
new file mode 100644
index 0000000..7478321
--- /dev/null
+++ b/modules/flink-ext/ignite/README.txt
@@ -0,0 +1,7 @@
+This is Apache Ignite working directory that contains information that 
+    Ignite nodes need in order to function normally.
+Don't delete it unless you're sure you know what you're doing.
+
+You can change the location of working directory with 
+    igniteConfiguration.setWorkingDirectory(location) or 
+    <property name="workingDirectory" value="location"/> in IgniteConfiguration <bean>.
diff --git a/modules/spring-boot-autoconfigure/README.txt b/modules/spring-boot-autoconfigure/README.txt
new file mode 100644
index 0000000..ae7e34a
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/README.txt
@@ -0,0 +1,28 @@
+Apache Ignite Spring Boot Autoconfigure Module
+---------------------------
+
+Apache Ignite Spring Boot Autoconfigure module provides autoconfigure capabilities for Spring-boot based applications.
+
+Importing Spring Boot Autoconfigure Module In Maven Project
+----------------------------------------
+
+If you are using Maven to manage dependencies of your project, you can add Spring module
+dependency like this (replace '${ignite.version}' with actual Ignite version you are
+interested in):
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    ...
+    <dependencies>
+        ...
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>spring-boot-ignite-autoconfigure</artifactId>
+            <version>${ignite.version}</version>
+        </dependency>
+        ...
+    </dependencies>
+    ...
+</project>
diff --git a/modules/spring-boot-autoconfigure/licenses/apache-2.0.txt b/modules/spring-boot-autoconfigure/licenses/apache-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/licenses/apache-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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
+
+       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/modules/spring-boot-autoconfigure/pom.xml b/modules/spring-boot-autoconfigure/pom.xml
new file mode 100644
index 0000000..9c00da4
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<!--
+    POM file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.ignite</groupId>
+        <artifactId>ignite-parent</artifactId>
+        <version>1</version>
+        <relativePath>../../parent</relativePath>
+    </parent>
+
+    <properties>
+        <ignite.version>2.9.0-SNAPSHOT</ignite.version>
+    </properties>
+
+    <artifactId>spring-boot-ignite-autoconfigure</artifactId>
+    <version>${spring-boot.version}-${ignite.version}</version>
+    <url>http://ignite.apache.org</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${ignite.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-log4j</artifactId>
+            <version>${ignite.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>${h2.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${ignite.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-beans</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-context</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <version>${spring-boot.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/modules/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteConfigurer.java b/modules/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteConfigurer.java
new file mode 100644
index 0000000..1339f80
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteConfigurer.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.ignite;
+
+import java.util.function.Consumer;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.springframework.beans.factory.BeanFactory;
+
+/**
+ * Instance of this interface available in {@link BeanFactory} will be used to customize empty
+ * {@link IgniteConfiguration} during Ignite node start. If you want to set custom SPI instances or
+ * similar hardcoded values you should do it in the implementation of this interface.
+ *
+ * @see IgniteConfiguration
+ * @see IgniteNodeAutoConfiguration
+ */
+public interface IgniteConfigurer extends Consumer<IgniteConfiguration> { /* No-op. */ }
diff --git a/modules/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteNodeAutoConfiguration.java b/modules/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteNodeAutoConfiguration.java
new file mode 100644
index 0000000..66d13de
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteNodeAutoConfiguration.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.ignite;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Ignite node auto configuration.
+ * Spring will use this class to autoconfigure Ignite node on application startup.
+ *
+ * Initialization of the node will be the following:
+ * <ul>
+ *   <li>If {@link IgniteConfiguration} bean exists in {@link BeanFactory} it will be used for the node start.</li>
+ *   <li>If {@link IgniteConfiguration} bean doesn't exists following rules are applied:
+ *     <ol>
+ *       <li>If bean of the type {@link IgniteConfigurer} exists in {@link BeanFactory}
+ *         it will be used to customize empty {@link IgniteConfiguration} instance.
+ *         If you want to set custom SPI instances or similar hardcoded values.
+ *         You should do it in custom {@link IgniteConfigurer}.</li>
+ *       <li>Application properties will override config values. Prefix for properties names is "ignite".</li>
+ *     </ol>
+ *   </li>
+ * </ul>
+ *
+ * Example of application property:
+ * <pre>
+ *   ignite.igniteInstanceName=my-instance
+ * </pre>
+ *
+ * @see IgniteConfigurer
+ * @see IgniteConfiguration
+ * @see Ignite
+ */
+@Configuration
+@EnableConfigurationProperties
+public class IgniteNodeAutoConfiguration {
+    /** Ignite configuration properties prefix. */
+    public static final String IGNITE_PROPS_PREFIX = "ignite";
+
+    /**
+     * @return Default(empty) Ignite configurer.
+     */
+    @ConditionalOnMissingBean
+    @Bean
+    public IgniteConfigurer nodeConfigurer() {
+        return cfg -> { /* No-op. */ };
+    }
+
+    /**
+     * Provides an instance of {@link IgniteConfiguration} customized with the {@link IgniteConfigurer}.
+     *
+     * @param configurer Configurer.
+     * @return Ignite configuration.
+     */
+    @ConditionalOnMissingBean
+    @Bean
+    @ConfigurationProperties(prefix = IGNITE_PROPS_PREFIX)
+    public IgniteConfiguration igniteConfiguration(IgniteConfigurer configurer) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        configurer.accept(cfg);
+
+        return cfg;
+    }
+
+    /**
+     * Starts an {@link Ignite} node.
+     *
+     * @param cfg Configuration.
+     * @return Ignite instance.
+     */
+    @ConditionalOnBean(IgniteConfiguration.class)
+    @Bean
+    public Ignite ignite(IgniteConfiguration cfg) {
+        return Ignition.start(cfg);
+    }
+}
diff --git a/modules/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/modules/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..8c8dd31
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,17 @@
+# 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.
+
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.springframework.boot.autoconfigure.ignite.IgniteNodeAutoConfiguration
diff --git a/modules/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ignite/IgniteNodeAutoconfigureTest.java b/modules/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ignite/IgniteNodeAutoconfigureTest.java
new file mode 100644
index 0000000..32f0909
--- /dev/null
+++ b/modules/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ignite/IgniteNodeAutoconfigureTest.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.ignite;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+
+/** Tests {@link IgniteNodeAutoConfiguration} feature. */
+@ExtendWith(SpringExtension.class)
+public class IgniteNodeAutoconfigureTest {
+    /** Spring test application context. */
+    private ApplicationContextRunner contextRunner;
+
+    /** */
+    @BeforeEach
+    public void beforeTest() {
+        contextRunner = new ApplicationContextRunner()
+            .withConfiguration(AutoConfigurations.of(IgniteNodeAutoConfiguration.class));
+    }
+
+    /** Tests that Ignite node start without explicit configuration. */
+    @Test
+    public void testIgniteStarts() throws Exception {
+        contextRunner.run((context) -> {
+            assertThat(context).hasSingleBean(IgniteConfiguration.class);
+            assertThat(context).hasSingleBean(Ignite.class);
+        });
+    }
+
+    /** Tests that Ignite node will use configuration provided in {@link BeanFactory}. */
+    @Test
+    public void testIgniteUseProvidedConfiguration() throws Exception {
+        IgniteConfiguration cfg = new IgniteConfiguration()
+            .setIgniteInstanceName("test-name")
+            .setConsistentId("test-id");
+
+        contextRunner.withBean(IgniteConfiguration.class, () -> cfg).run((context) -> {
+            assertThat(context).hasSingleBean(IgniteConfiguration.class);
+            assertThat(context).hasSingleBean(Ignite.class);
+
+            IgniteConfiguration cfg0 = context.getBean(IgniteConfiguration.class);
+
+            assertEquals("Expecting usage of the configuration from context", cfg.getIgniteInstanceName(),
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", cfg.getConsistentId(),
+                cfg0.getConsistentId());
+
+            cfg0 = context.getBean(Ignite.class).configuration();
+
+            assertEquals("Expecting usage of the configuration from context", cfg.getIgniteInstanceName(),
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", cfg.getConsistentId(),
+                cfg0.getConsistentId());
+        });
+    }
+
+    /** Tests that Spring will use {@link IgniteConfigurer} to customize {@link IgniteConfiguration}. */
+    @Test
+    public void testIgniteConfigurer() throws Exception {
+        String instanceName = "configurer-test-name";
+        String consistentId = "configurer-test-id";
+
+        ApplicationContextRunner runner = contextRunner.withBean(IgniteConfigurer.class,
+            () -> cfg -> {
+                cfg.setIgniteInstanceName(instanceName).setConsistentId(consistentId);
+            });
+
+        runner.run((context) -> {
+            assertThat(context).hasSingleBean(IgniteConfiguration.class);
+            assertThat(context).hasSingleBean(Ignite.class);
+
+            IgniteConfiguration cfg0 = context.getBean(IgniteConfiguration.class);
+
+            assertEquals("Expecting usage of the configuration from context", instanceName,
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", consistentId,
+                cfg0.getConsistentId());
+
+            cfg0 = context.getBean(Ignite.class).configuration();
+
+            assertEquals("Expecting usage of the configuration from context", instanceName,
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", consistentId,
+                cfg0.getConsistentId());
+        });
+    }
+
+    /** Tests that Spring will use application properties to customize {@link IgniteConfiguration}. */
+    @Test
+    public void testIgniteUseApplicationProperties() throws Exception {
+        ApplicationContextRunner runner = contextRunner.withPropertyValues(
+                "ignite.igniteInstanceName=from-property-name",
+                "ignite.consistentId=from-property-id");
+
+        String instanceName = "from-property-name";
+        String consistentId = "from-property-id";
+
+        runner.run((context) -> {
+            assertThat(context).hasSingleBean(IgniteConfiguration.class);
+            assertThat(context).hasSingleBean(Ignite.class);
+
+            IgniteConfiguration cfg0 = context.getBean(IgniteConfiguration.class);
+
+            assertEquals("Expecting usage of the configuration from context", instanceName,
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", consistentId,
+                cfg0.getConsistentId());
+
+            cfg0 = context.getBean(Ignite.class).configuration();
+
+            assertEquals("Expecting usage of the configuration from context", instanceName,
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", consistentId,
+                cfg0.getConsistentId());
+        });
+    }
+
+    /**
+     * Tests that application properties will override {@link IgniteConfiguration} provided by {@link IgniteConfigurer}.
+     */
+    @Test
+    public void testApplicationPropertiesOverridesConfigurer() throws Exception {
+        String instanceName = "test-name";
+        String consistentId = "from-property-id";
+
+        ApplicationContextRunner runner = contextRunner
+            .withPropertyValues("ignite.consistentId=from-property-id")
+            .withBean(IgniteConfigurer.class,
+            () -> cfg -> {
+                cfg.setIgniteInstanceName(instanceName).setConsistentId("test-id");
+            });
+
+        runner.run((context) -> {
+            assertThat(context).hasSingleBean(IgniteConfiguration.class);
+            assertThat(context).hasSingleBean(Ignite.class);
+
+            IgniteConfiguration cfg0 = context.getBean(IgniteConfiguration.class);
+
+            assertEquals("Expecting usage of the configuration from context", instanceName,
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", consistentId,
+                cfg0.getConsistentId());
+
+            cfg0 = context.getBean(Ignite.class).configuration();
+
+            assertEquals("Expecting usage of the configuration from context", instanceName,
+                cfg0.getIgniteInstanceName());
+            assertEquals("Expecting usage of the configuration from context", consistentId,
+                cfg0.getConsistentId());
+        });
+    }
+}
diff --git a/modules/spring-boot-client-autoconfigure/README.txt b/modules/spring-boot-client-autoconfigure/README.txt
new file mode 100644
index 0000000..f60df1c
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/README.txt
@@ -0,0 +1,28 @@
+Apache Ignite Client Spring Boot Autoconfigure Module
+---------------------------
+
+Apache Ignite Spring Boot Autoconfigure module provides autoconfigure capabilities for Spring-boot based applications.
+
+Importing Spring Boot Autoconfigure Module In Maven Project
+----------------------------------------
+
+If you are using Maven to manage dependencies of your project, you can add Spring module
+dependency like this (replace '${ignite.version}' with actual Ignite version you are
+interested in):
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    ...
+    <dependencies>
+        ...
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>spring-boot-ignite-client-autoconfigure</artifactId>
+            <version>${ignite.version}</version>
+        </dependency>
+        ...
+    </dependencies>
+    ...
+</project>
diff --git a/modules/spring-boot-client-autoconfigure/licenses/apache-2.0.txt b/modules/spring-boot-client-autoconfigure/licenses/apache-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/licenses/apache-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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
+
+       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/modules/spring-boot-client-autoconfigure/pom.xml b/modules/spring-boot-client-autoconfigure/pom.xml
new file mode 100644
index 0000000..72523e6
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<!--
+    POM file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.ignite</groupId>
+        <artifactId>ignite-parent</artifactId>
+        <version>1</version>
+        <relativePath>../../parent</relativePath>
+    </parent>
+
+    <properties>
+        <ignite.version>2.9.0-SNAPSHOT</ignite.version>
+    </properties>
+
+    <artifactId>spring-boot-ignite-client-autoconfigure</artifactId>
+    <version>${spring-boot.version}-${ignite.version}</version>
+    <url>http://ignite.apache.org</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${ignite.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-log4j</artifactId>
+            <version>${ignite.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>${h2.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${ignite.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-beans</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-context</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <version>${spring-boot.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/modules/spring-boot-client-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteClientAutoConfiguration.java b/modules/spring-boot-client-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteClientAutoConfiguration.java
new file mode 100644
index 0000000..b28b3ad
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteClientAutoConfiguration.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.ignite;
+
+import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Ignite client auto configuration.
+ * Spring will use this class to autoconfigure Ignite client on application startup.
+ *
+ * Initialization of the node will be the following:
+ * <ul>
+ *   <li>If {@link ClientConfiguration} bean exists in {@link BeanFactory} it will be used for the node start.</li>
+ *   <li>If {@link ClientConfiguration} bean doesn't exists following rules are applied:
+ *     <ol>
+ *       <li>If bean of the type {@link IgniteClientConfigurer} exists in {@link BeanFactory}
+ *         it will be used to customize empty {@link ClientConfiguration} instance.
+ *         If you want to set custom SPI instances or similar hardcoded values.
+ *         You should do it in custom {@link IgniteClientConfigurer}.</li>
+ *       <li>Application properties will override config values. Prefix for properties names is "ignite-client".</li>
+ *     </ol>
+ *   </li>
+ * </ul>
+ *
+ * Example of application property:
+ * <pre>
+ *   ignite-client.clientAddresses=127.0.0.1:10800
+ * </pre>
+ *
+ * @see IgniteClient
+ * @see ClientConfiguration
+ */
+@Configuration
+@EnableConfigurationProperties
+public class IgniteClientAutoConfiguration {
+    /** Ignite client configuration properties prefix. */
+    public static final String IGNITE_CLIENT_PROPS_PREFIX = "ignite-client";
+
+    /**
+     * @return Default(empty) Ignite client configurer.
+     */
+    @ConditionalOnMissingBean
+    @Bean
+    public IgniteClientConfigurer clientConfigurer() {
+        return cfg -> { /* No-op. */ };
+    }
+
+    /**
+     * Provides an instance of {@link ClientConfiguration} customized with the {@link IgniteClientConfigurer}.
+     *
+     * @param configurer Configurer.
+     * @return Client configuration.
+     */
+    @ConditionalOnMissingBean
+    @Bean
+    @ConfigurationProperties(prefix = IGNITE_CLIENT_PROPS_PREFIX)
+    public ClientConfiguration clientConfiguration(IgniteClientConfigurer configurer) {
+        ClientConfiguration cfg = new ClientConfiguration();
+
+        configurer.accept(cfg);
+
+        return cfg;
+    }
+
+    /**
+     * Starts an {@link IgniteClient}.
+     *
+     * @param cfg Configuration.
+     * @return Client instance.
+     */
+    @ConditionalOnBean(ClientConfiguration.class)
+    @Bean
+    public IgniteClient igniteClient(ClientConfiguration cfg) {
+        return Ignition.startClient(cfg);
+    }
+}
diff --git a/modules/spring-boot-client-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteClientConfigurer.java b/modules/spring-boot-client-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteClientConfigurer.java
new file mode 100644
index 0000000..2ce2509
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ignite/IgniteClientConfigurer.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.ignite;
+
+import java.util.function.Consumer;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.springframework.beans.factory.BeanFactory;
+
+/**
+ * Instance of this interface available in {@link BeanFactory} will be used to customize empty
+ * {@link ClientConfiguration} during Ignite client start. If you want to set custom property instances or
+ * similar hardcoded values you should do it in the implementation of this interface.
+ *
+ * @see ClientConfiguration
+ * @see IgniteClientAutoConfiguration
+ */
+public interface IgniteClientConfigurer extends Consumer<ClientConfiguration> { /* No-op. */ }
diff --git a/modules/spring-boot-client-autoconfigure/src/main/resources/META-INF/spring.factories b/modules/spring-boot-client-autoconfigure/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..a8e5ec6
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,17 @@
+# 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.
+
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.springframework.boot.autoconfigure.ignite.IgniteClientAutoConfiguration
diff --git a/modules/spring-boot-client-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ignite/IgniteClientAutoConfigureTest.java b/modules/spring-boot-client-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ignite/IgniteClientAutoConfigureTest.java
new file mode 100644
index 0000000..d58d030
--- /dev/null
+++ b/modules/spring-boot-client-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ignite/IgniteClientAutoConfigureTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.ignite;
+
+import java.util.Collections;
+import java.util.Set;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/** Tests {@link IgniteClientAutoConfiguration} feature. */
+@ExtendWith(SpringExtension.class)
+public class IgniteClientAutoConfigureTest {
+    /** Default address. */
+    public static final String DEFAULT_ADDR = "127.0.0.1:10800";
+
+    /** Cache names. */
+    public static final Set<String> CACHES = Collections.singleton("my-cache");
+
+    /** Spring test application context. */
+    private ApplicationContextRunner contextRunner;
+
+    /** Server node. */
+    private static Ignite node;
+
+    /** */
+    @BeforeAll
+    public static void beforeClass() {
+        node = Ignition.start(new IgniteConfiguration());
+
+        for (String cache : CACHES)
+            node.createCache(cache);
+    }
+
+    /** */
+    @AfterAll
+    public static void afterClass() {
+        node.close();
+    }
+
+    /** */
+    @BeforeEach
+    public void beforeTest() {
+        contextRunner = new ApplicationContextRunner()
+            .withConfiguration(AutoConfigurations.of(IgniteClientAutoConfiguration.class));
+    }
+
+    /** Tests that Ignite node start without explicit configuration. */
+    @Test
+    public void testIgniteClientStarts() throws Exception {
+        contextRunner
+            .withPropertyValues("ignite-client.addresses=" + DEFAULT_ADDR)
+            .run(this::checkContext);
+    }
+
+    /** Tests that Ignite node will use configuration provided in {@link BeanFactory}. */
+    @Test
+    public void testIgniteClientUseProvidedConfiguration() throws Exception {
+        contextRunner
+            .withBean(ClientConfiguration.class, () -> new ClientConfiguration().setAddresses(DEFAULT_ADDR))
+            .run(this::checkContext);
+    }
+
+    /** Tests that Spring will use {@link IgniteClientConfigurer} to customize {@link ClientConfiguration}. */
+    @Test
+    public void testIgniteClientConfigurer() throws Exception {
+        contextRunner
+            .withBean(IgniteClientConfigurer.class, () -> cfg -> cfg.setAddresses(DEFAULT_ADDR))
+            .run(this::checkContext);
+    }
+
+    /**
+     * Tests that application properties will override {@link ClientConfiguration}
+     * provided by {@link IgniteClientConfigurer}.
+     */
+    @Test
+    public void testApplicationPropertiesOverridesConfigurer() throws Exception {
+        contextRunner
+            .withPropertyValues("ignite-client.addresses=" + DEFAULT_ADDR)
+            .withBean(IgniteClientConfigurer.class,
+                //Intentionally setting wrong connect address.
+                //Application property should override this address
+                () -> cfg -> cfg.setAddresses("1.1.1.1:8080"))
+            .run(this::checkContext);
+    }
+
+    /** @param context Context to check */
+    private void checkContext(AssertableApplicationContext context) {
+        assertThat(context).hasSingleBean(ClientConfiguration.class);
+        assertThat(context).hasSingleBean(IgniteClient.class);
+
+        ClientConfiguration cfg = context.getBean(ClientConfiguration.class);
+
+        assertEquals(1, cfg.getAddresses().length);
+        assertEquals(DEFAULT_ADDR, cfg.getAddresses()[0]);
+
+        IgniteClient cli = context.getBean(IgniteClient.class);
+
+        assertTrue(CACHES.containsAll(cli.cacheNames()));
+    }
+}
diff --git a/parent/pom.xml b/parent/pom.xml
index 077161c..46a5f46 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -129,6 +129,7 @@
         <spring.data-2.0.version>2.0.9.RELEASE</spring.data-2.0.version> <!-- don't forget to update spring-5.0 version -->
         <spring-5.0.version>5.0.8.RELEASE</spring-5.0.version><!-- don't forget to update spring-data-2.0 version -->
         <spring41.osgi.feature.version>4.1.7.RELEASE_1</spring41.osgi.feature.version>
+        <spring-boot.version>2.2.2.RELEASE</spring-boot.version>
         <storm.version>1.1.1</storm.version>
         <tomcat.version>9.0.10</tomcat.version>
         <twitter.hbc.version>2.2.0</twitter.hbc.version>
diff --git a/pom.xml b/pom.xml
index bd0c46e..59d8ae9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
         <relativePath>parent</relativePath>
     </parent>
 
-    <artifactId>apache-ignite-extensions</artifactId>
+    <artifactId>ache-ignite-extensions</artifactId>
     <version>1.0.0-SNAPSHOT</version>
     <packaging>pom</packaging>
 
@@ -44,6 +44,8 @@
     <modules>
         <module>modules/flink-ext</module>
         <module>modules/pub-sub</module>
+        <module>modules/spring-boot-autoconfigure</module>
+        <module>modules/spring-boot-client-autoconfigure</module>
     </modules>
 
     <profiles>
