diff --git a/modules/spring-sessions/pom.xml b/modules/spring-sessions-ext/pom.xml
similarity index 100%
rename from modules/spring-sessions/pom.xml
rename to modules/spring-sessions-ext/pom.xml
diff --git a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
similarity index 99%
rename from modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
rename to modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
index 8ac5b17..b49dd33 100644
--- a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
+++ b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/EnableIgniteHttpSession.java
@@ -97,3 +97,4 @@
     SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE;
 
 }
+
diff --git a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
similarity index 93%
rename from modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
rename to modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
index 3adc2a4..8c31464 100644
--- a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
+++ b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfiguration.java
@@ -49,64 +49,42 @@
 @Configuration(proxyBeanMethods = false)
 public class IgniteHttpSessionConfiguration extends SpringHttpSessionConfiguration implements ImportAware {
 
-    /**
-     *
-     */
+    /** */
     private Integer maxInactiveIntervalInSeconds = MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS;
 
-    /**
-     *
-     */
+    /** */
     private String sessionMapName = IgniteIndexedSessionRepository.DEFAULT_SESSION_MAP_NAME;
 
-    /**
-     *
-     */
+    /** */
     private FlushMode flushMode = FlushMode.ON_SAVE;
 
-    /**
-     *
-     */
+    /** */
     private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE;
 
-    /**
-     *
-     */
+    /** */
     private Ignite ignite;
 
-    /**
-     *
-     */
+    /** */
     private ApplicationEventPublisher applicationEventPublisher;
 
-    /**
-     *
-     */
+    /** */
     private IndexResolver<Session> indexResolver;
 
-    /**
-     *
-     */
+    /** */
     private List<SessionRepositoryCustomizer<IgniteIndexedSessionRepository>> sessionRepositoryCustomizers;
 
-    /**
-     *
-     */
+    /** */
     @Bean
     public SessionRepository<?> sessionRepository() {
         return createIgniteIndexedSessionRepository();
     }
 
-    /**
-     *
-     */
+    /** */
     public void setMaxInactiveIntervalInSeconds(int maxInactiveIntervalInSeconds) {
         this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds;
     }
 
-    /**
-     *
-     */
+    /** */
     public void setSessionMapName(String sessionMapName) {
         this.sessionMapName = sessionMapName;
     }
@@ -118,16 +96,12 @@
         this.flushMode = flushMode;
     }
 
-    /**
-     *
-     */
+    /** */
     public void setSaveMode(SaveMode saveMode) {
         this.saveMode = saveMode;
     }
 
-    /**
-     *
-     */
+    /** */
     @Autowired
     public void setIgnite(@SpringSessionIgnite ObjectProvider<Ignite> springSessionIgnite,
                           ObjectProvider<Ignite> ignite) {
@@ -138,34 +112,26 @@
         this.ignite = igniteToUse;
     }
 
-    /**
-     *
-     */
+    /** */
     @Autowired
     public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
         this.applicationEventPublisher = applicationEventPublisher;
     }
 
-    /**
-     *
-     */
+    /** */
     @Autowired(required = false)
     public void setIndexResolver(IndexResolver<Session> indexResolver) {
         this.indexResolver = indexResolver;
     }
 
-    /**
-     *
-     */
+    /** */
     @Autowired(required = false)
     public void setSessionRepositoryCustomizer(
             ObjectProvider<SessionRepositoryCustomizer<IgniteIndexedSessionRepository>> sessionRepositoryCustomizers) {
         this.sessionRepositoryCustomizers = sessionRepositoryCustomizers.orderedStream().collect(Collectors.toList());
     }
 
-    /**
-     *
-     */
+    /** */
     @Override @SuppressWarnings("deprecation") public void setImportMetadata(AnnotationMetadata importMetadata) {
         Map<String, Object> attributeMap = importMetadata
                 .getAnnotationAttributes(EnableIgniteHttpSession.class.getName());
@@ -179,9 +145,7 @@
         this.saveMode = attributes.getEnum("saveMode");
     }
 
-    /**
-     *
-     */
+    /** */
     private IgniteIndexedSessionRepository createIgniteIndexedSessionRepository() {
         IgniteIndexedSessionRepository sessionRepository = new IgniteIndexedSessionRepository(this.ignite);
         sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher);
@@ -200,3 +164,4 @@
     }
 }
 
+
diff --git a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
similarity index 93%
rename from modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
rename to modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
index 5318883..155d978 100644
--- a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
+++ b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepository.java
@@ -109,24 +109,16 @@
      */
     public static final String DEFAULT_SESSION_MAP_NAME = "spring:session:sessions";
 
-    /**
-     *
-     */
+    /** */
     private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
 
-    /**
-     *
-     */
+    /** */
     private static final Log logger = LogFactory.getLog(IgniteIndexedSessionRepository.class);
 
-    /**
-     *
-     */
+    /** */
     private final Ignite ignite;
 
-    /**
-     *
-     */
+    /** */
     private ApplicationEventPublisher eventPublisher = (event) -> {
     };
 
@@ -136,34 +128,22 @@
      */
     private Integer defaultMaxInactiveInterval;
 
-    /**
-     *
-     */
+    /** */
     private IndexResolver<Session> indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
 
-    /**
-     *
-     */
+    /** */
     private String sessionMapName = DEFAULT_SESSION_MAP_NAME;
 
-    /**
-     *
-     */
+    /** */
     private FlushMode flushMode = FlushMode.ON_SAVE;
 
-    /**
-     *
-     */
+    /** */
     private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE;
 
-    /**
-     *
-     */
+    /** */
     private IgniteCache<String, IgniteSession> sessions;
 
-    /**
-     *
-     */
+    /** */
     private CacheEntryListenerConfiguration<String, IgniteSession> listenerConfiguration;
 
     /**
@@ -175,9 +155,7 @@
         this.ignite = ignite;
     }
 
-    /**
-     *
-     */
+    /** */
     @PostConstruct
     public void init() {
         final CacheConfiguration<String, IgniteSession> configuration = new CacheConfiguration<String, IgniteSession>(
@@ -209,9 +187,7 @@
         this.sessions.registerCacheEntryListener(this.listenerConfiguration);
     }
 
-    /**
-     *
-     */
+    /** */
     @PreDestroy
     public void close() {
         this.sessions.deregisterCacheEntryListener(this.listenerConfiguration);
@@ -275,9 +251,7 @@
         this.saveMode = saveMode;
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public IgniteSession createSession() {
         MapSession cached = new MapSession();
         if (this.defaultMaxInactiveInterval != null)
@@ -288,9 +262,7 @@
         return session;
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public void save(IgniteSession session) {
         if (session.isNew)
             ttlSessions(session.getMaxInactiveInterval()).put(session.getId(), session);
@@ -311,9 +283,7 @@
         session.clearChangeFlags();
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public IgniteSession findById(String id) {
         IgniteSession saved = this.sessions.get(id);
         if (saved == null)
@@ -327,16 +297,12 @@
         return saved;
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public void deleteById(String id) {
         this.sessions.remove(id);
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public Map<String, IgniteSession> findByIndexNameAndIndexValue(String indexName, String indexValue) {
         if (!PRINCIPAL_NAME_INDEX_NAME.equals(indexName))
             return Collections.emptyMap();
@@ -360,9 +326,7 @@
         return sessionMap;
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public void onCreated(Iterable<CacheEntryEvent<? extends String, ? extends IgniteSession>> events)
             throws CacheEntryListenerException {
         events.forEach((event) -> {
@@ -376,9 +340,7 @@
         });
     }
 
-    /**
-     *
-     */
+    /** */
     @Override
     public void onExpired(Iterable<CacheEntryEvent<? extends String, ? extends IgniteSession>> events)
             throws CacheEntryListenerException {
@@ -390,9 +352,7 @@
         });
     }
 
-    /**
-     *
-     */
+    /** */
     @Override public void onRemoved(Iterable<CacheEntryEvent<? extends String, ? extends IgniteSession>> events)
             throws CacheEntryListenerException {
         events.forEach((event) -> {
@@ -430,51 +390,35 @@
      */
     final class IgniteSession implements Session {
 
-        /**
-         *
-         */
+        /** */
         @QuerySqlField
         private final MapSession delegate;
 
-        /**
-         *
-         */
+        /** */
         @GridDirectTransient
         private boolean isNew;
 
-        /**
-         *
-         */
+        /** */
         @GridDirectTransient
         private boolean sessionIdChanged;
 
-        /**
-         *
-         */
+        /** */
         @GridDirectTransient
         private boolean lastAccessedTimeChanged;
 
-        /**
-         *
-         */
+        /** */
         @GridDirectTransient
         private boolean maxInactiveIntervalChanged;
 
-        /**
-         *
-         */
+        /** */
         @GridDirectTransient
         private String originalId;
 
-        /**
-         *
-         */
+        /** */
         @GridDirectTransient
         private Map<String, Object> delta = new HashMap<>();
 
-        /**
-         *
-         */
+        /** */
         @QuerySqlField(index = true)
         private String principal;
 
@@ -488,71 +432,53 @@
 
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public void setLastAccessedTime(Instant lastAccessedTime) {
             this.delegate.setLastAccessedTime(lastAccessedTime);
             this.lastAccessedTimeChanged = true;
             flushImmediateIfNecessary();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public boolean isExpired() {
             return this.delegate.isExpired();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public Instant getCreationTime() {
             return this.delegate.getCreationTime();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public String getId() {
             return this.delegate.getId();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public String changeSessionId() {
             String newSessionId = this.delegate.changeSessionId();
             this.sessionIdChanged = true;
             return newSessionId;
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public Instant getLastAccessedTime() {
             return this.delegate.getLastAccessedTime();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public void setMaxInactiveInterval(Duration interval) {
             this.delegate.setMaxInactiveInterval(interval);
             this.maxInactiveIntervalChanged = true;
             flushImmediateIfNecessary();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public Duration getMaxInactiveInterval() {
             return this.delegate.getMaxInactiveInterval();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public <T> T getAttribute(String attributeName) {
             T attributeValue = this.delegate.getAttribute(attributeName);
             if (attributeValue != null
@@ -562,16 +488,12 @@
             return attributeValue;
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public Set<String> getAttributeNames() {
             return this.delegate.getAttributeNames();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public void setAttribute(String attributeName, Object attributeValue) {
             this.delegate.setAttribute(attributeName, attributeValue);
             this.delta.put(attributeName, attributeValue);
@@ -584,30 +506,22 @@
             flushImmediateIfNecessary();
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public void removeAttribute(String attributeName) {
             setAttribute(attributeName, null);
         }
 
-        /**
-         *
-         */
+        /** */
         MapSession getDelegate() {
             return this.delegate;
         }
 
-        /**
-         *
-         */
+        /** */
         boolean hasChanges() {
             return (this.lastAccessedTimeChanged || this.maxInactiveIntervalChanged || !this.delta.isEmpty());
         }
 
-        /**
-         *
-         */
+        /** */
         void clearChangeFlags() {
             this.isNew = false;
             this.lastAccessedTimeChanged = false;
@@ -616,17 +530,13 @@
             this.delta.clear();
         }
 
-        /**
-         *
-         */
+        /** */
         private void flushImmediateIfNecessary() {
             if (IgniteIndexedSessionRepository.this.flushMode == FlushMode.IMMEDIATE)
                 IgniteIndexedSessionRepository.this.save(this);
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public boolean equals(Object o) {
             if (this == o)
                 return true;
@@ -638,12 +548,11 @@
             return this.delegate.equals(session.delegate);
         }
 
-        /**
-         *
-         */
+        /** */
         @Override public int hashCode() {
             return Objects.hash(this.delegate);
         }
     }
 }
 
+
diff --git a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/SessionEventRegistry.java b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/SessionEventRegistry.java
similarity index 92%
rename from modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/SessionEventRegistry.java
rename to modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/SessionEventRegistry.java
index de1a3ce..0c0af0c 100644
--- a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/SessionEventRegistry.java
+++ b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/SessionEventRegistry.java
@@ -31,19 +31,13 @@
  */
 class SessionEventRegistry implements ApplicationListener<AbstractSessionEvent> {
 
-    /**
-     *
-     */
+    /** */
     private Map<String, AbstractSessionEvent> events = new HashMap<>();
 
-    /**
-     *
-     */
+    /** */
     private ConcurrentMap<String, Object> locks = new ConcurrentHashMap<>();
 
-    /**
-     *
-     */
+    /** */
     @Override public void onApplicationEvent(AbstractSessionEvent event) {
         String sessionId = event.getSessionId();
         this.events.put(sessionId, event);
@@ -53,31 +47,23 @@
         }
     }
 
-    /**
-     *
-     */
+    /** */
     void clear() {
         this.events.clear();
         this.locks.clear();
     }
 
-    /**
-     *
-     */
+    /** */
     boolean receivedEvent(String sessionId) throws InterruptedException {
         return waitForEvent(sessionId) != null;
     }
 
-    /**
-     *
-     */
+    /** */
     <E extends AbstractSessionEvent> E getEvent(String sessionId) throws InterruptedException {
         return (E) waitForEvent(sessionId);
     }
 
-    /**
-     *
-     */
+    /** */
     private <E extends AbstractSessionEvent> E waitForEvent(String sessionId) throws InterruptedException {
         Object lock = getLock(sessionId);
         synchronized (lock) {
@@ -88,10 +74,9 @@
         return (E) this.events.get(sessionId);
     }
 
-    /**
-     *
-     */
+    /** */
     private Object getLock(String sessionId) {
         return this.locks.computeIfAbsent(sessionId, (k) -> new Object());
     }
 }
+
diff --git a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
similarity index 99%
rename from modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
rename to modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
index b120a49..3db23fc 100644
--- a/modules/spring-sessions/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
+++ b/modules/spring-sessions-ext/src/main/java/org/apache/ignite/spring/sessions/SpringSessionIgnite.java
@@ -38,3 +38,4 @@
 public @interface SpringSessionIgnite {
 
 }
+
diff --git a/modules/spring-sessions/src/main/java/package-info.java b/modules/spring-sessions-ext/src/main/java/package-info.java
similarity index 100%
rename from modules/spring-sessions/src/main/java/package-info.java
rename to modules/spring-sessions-ext/src/main/java/package-info.java
diff --git a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
similarity index 99%
rename from modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
rename to modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
index 8d95278..8277716 100644
--- a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
+++ b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/AbstractIgniteIndexedSessionRepositoryITests.java
@@ -229,3 +229,4 @@
     }
 
 }
+
diff --git a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
similarity index 99%
rename from modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
rename to modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
index fefa761..d11ae54 100644
--- a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
+++ b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/EmbeddedIgniteIndexedSessionRepositoryITests.java
@@ -58,4 +58,4 @@
 
     }
 
-}
\ No newline at end of file
+}
diff --git a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
similarity index 99%
rename from modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
rename to modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
index 09ea373..cdffcd6 100644
--- a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
+++ b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteHttpSessionConfigurationTests.java
@@ -437,3 +437,4 @@
         }
     }
 }
+
diff --git a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
similarity index 99%
rename from modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
rename to modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
index c0a9503..f18d119 100644
--- a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
+++ b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteITestUtils.java
@@ -36,3 +36,4 @@
         return Ignition.start();
     }
 }
+
diff --git a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
similarity index 99%
rename from modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
rename to modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
index 17f69a3..76cc572 100644
--- a/modules/spring-sessions/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
+++ b/modules/spring-sessions-ext/src/test/java/org/apache/ignite/spring/sessions/IgniteIndexedSessionRepositoryTests.java
@@ -448,3 +448,4 @@
     }
 
 }
+
