You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ignite.apache.org by GitBox <gi...@apache.org> on 2019/01/04 13:00:24 UTC

[GitHub] oignatenko closed pull request #5747: GG-14582 Backport JUnit 4 to 2.7 master

oignatenko closed pull request #5747: GG-14582 Backport JUnit 4 to 2.7 master
URL: https://github.com/apache/ignite/pull/5747
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/DEVNOTES.txt b/DEVNOTES.txt
index 7785ee780a4b..307189059ae7 100644
--- a/DEVNOTES.txt
+++ b/DEVNOTES.txt
@@ -1,4 +1,4 @@
-Ignite Fabric Maven Build Instructions
+Apache Ignite Maven Build Instructions
 ======================================
 1) Optional: build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt.
 
@@ -15,14 +15,14 @@ Ignite Fabric Maven Build Instructions
 
         mvn initialize -Pjavadoc
 
-4) Assembly Apache Ignite fabric:
+4) Assembly Apache Ignite:
 
         mvn initialize -Prelease
 
-Look for apache-ignite-fabric-<version>-bin.zip in ./target/bin directory.
+Look for apache-ignite-<version>-bin.zip in ./target/bin directory.
 
 
-Ignite Fabric with LGPL Maven Build Instructions
+Apache Ignite with LGPL Maven Build Instructions
 ================================================
 1) Optional: build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt.
 
@@ -39,11 +39,11 @@ Ignite Fabric with LGPL Maven Build Instructions
 
         mvn initialize -Pjavadoc,lgpl
 
-4) Assembly Apache Ignite fabric with LGPL dependencies:
+4) Assembly Apache Ignite  with LGPL dependencies:
 
-        mvn initialize -Prelease,lgpl -Dignite.edition=fabric-lgpl
+        mvn initialize -Prelease,lgpl -Dignite.edition=apache-ignite-lgpl
 
-   Look for apache-ignite-fabric-lgpl-<version>-bin.zip in ./target/bin directory.
+   Look for apache-ignite-lgpl-<version>-bin.zip in ./target/bin directory.
 
 
 Ignite Hadoop Accelerator Maven Build Instructions
@@ -60,7 +60,7 @@ Ignite Hadoop Accelerator Maven Build Instructions
 
 2) Assembly Hadoop Accelerator:
 
-        mvn initialize -Prelease -Dignite.edition=hadoop
+        mvn initialize -Prelease -Dignite.edition=apache-ignite-hadoop
 
    Look for apache-ignite-hadoop-<version>-bin.zip in ./target/bin directory. Resulting binary
    assembly will also include integration module for Apache Spark.
@@ -147,26 +147,21 @@ Ignite Release Instructions
 
 3) Deploy Ignite release candidate to maven repository and dev-svn, make tag:
 
-   3.1) Deploy Ignite to maven repository, prepares sources and fabric edition binaries.
+   3.1) Deploy Ignite to maven repository, prepares sources and binaries.
 
-                mvn deploy -Papache-release,gpg,all-java,all-scala,licenses,deploy-ignite-site -Dignite.edition=fabric -DskipTests
+                mvn deploy -Papache-release,gpg,all-java,all-scala,licenses,deploy-ignite-site -Dignite.edition=apache-ignite -DskipTests
 
    3.2) Javadoc generation:
 
                 mvn initialize -Pjavadoc
 
-   3.3) Assembly Apache Ignite Fabric:
+   3.3) Assembly Apache Ignite:
 
                 mvn initialize -Prelease
 
    3.4) Assembly Hadoop Accelerator:
 
-                mvn initialize -Prelease -Dignite.edition=hadoop
-
-   NOTE: Binary artifact name can be changed by setting additional property -Dignite.zip.pattern. Binary artifact will be
-   created inside /target/bin folder when release profile is used.
-
-   NOTE: Sources artifact name is fixed. Sources artifact will be created inside /target dir when apache-release profile is used.
+                mvn initialize -Prelease -Dignite.edition=apache-ignite-hadoop
 
    NOTE: Nexus staging (repository.apache.org) should be closed with appropriate comment contains release version and
    release candidate number, for example "Apache Ignite 1.0.0-rc7", when mvn deploy finished.
diff --git a/README.txt b/README.txt
index 7cfdaad01ed5..2e6add5125ea 100644
--- a/README.txt
+++ b/README.txt
@@ -1,5 +1,5 @@
-Apache Ignite In-Memory Data Fabric
-===================================
+Apache Ignite In-Memory Database and Caching Platform
+=====================================================
 
 Ignite is a memory-centric distributed database, caching, and processing platform for transactional, analytical,
 and streaming workloads delivering in-memory speeds at petabyte scale.
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index d4d3bf0514ce..9e28404eb214 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,8 +1,160 @@
 Apache Ignite Release Notes
 ===========================
 
-Apache Ignite In-Memory Data Fabric 2.6
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.7
+---------------------------------------------------------
+
+Ignite:
+* Added experimental support for multi-version concurrency control with snapshot isolation
+  - available for both cache API and SQL
+  - use CacheAtomicityMode.TRANSACTIONAL_SNAPSHOT to enable it
+  - not production ready, data consistency is not guaranteed in case of node failures
+* Implemented Transparent Data Encryption based on JKS certificates
+* Implemented Node.JS Thin Client
+* Implemented Python Thin Client
+* Implemented PHP Thin Client
+* Ignite start scripts now support Java 9 and higher
+* Added ability to set WAL history size in bytes
+* Added SslContextFactory.protocols and SslContextFactory.cipherSuites properties to control which SSL encryption algorithms can be used
+* Added JCache 1.1 compliance
+* Added IgniteCompute.withNoResultCache method with semantics similar to ComputeTaskNoResultCache annotation
+* Spring Data 2.0 is now supported in the separate module 'ignite-spring-data_2.0'
+* Added monitoring of critical system workers
+* Added ability to provide custom implementations of ExceptionListener for JmsStreamer
+* Ignite KafkaStreamer was upgraded to use new KafkaConsmer configuration
+* S3 IP Finder now supports subfolder usage instead of bucket root
+* Improved dynamic cache start speed
+* Improved checkpoint performance by decreasing mark duration.
+* Added ability to manage compression level for compressed WAL archives.
+* Added metrics for Entry Processor invocations.
+* Added JMX metrics: ClusterMetricsMXBean.getTotalBaselineNodes and ClusterMetricsMXBean.getActiveBaselineNodes
+* Node uptime metric now includes days count
+* Exposed info about thin client connections through JMX
+* Introduced new system property IGNITE_REUSE_MEMORY_ON_DEACTIVATE to enable reuse of allocated memory on node deactivation (disabled by default)
+* Optimistic transaction now will be properly rolled back if waiting too long for a new topology on remap
+* ScanQuery with setLocal flag now checks if the partition is actually present on local node
+* Improved cluster behaviour when a left node does not cause partition affinity assignment changes
+* Interrupting user thread during partition initialization will no longer cause node to stop
+* Fixed problem when partition lost event was not triggered if multiple nodes left cluster
+* Fixed massive node drop from the cluster on temporary network issues
+* Fixed service redeployment on cluster reactivation
+* Fixed client node stability under ZooKeeper discovery
+* Massive performance and stability improvements
+
+Ignite .Net:
+* Add .NET Core 2.1 support
+* Added thin client connection failover
+
+Ignite C++:
+* Implemented Thin Client with base cache operations
+* Implemented smart affinity routing for Thin Client to send requests directly to nodes containing data when possible
+* Added Clang compiler support
+
+SQL:
+* Added experimental support for fully ACID transactional SQL with the snapshot isolation:
+  - use CacheAtomicityMode.TRANSACTIONAL_SNAPSHOT to enable it
+  - a transaction can be started through native API (IgniteTransactions), thin JDBC driver or ODBC driver
+  - not production ready, data consistency is not guaranteed in case of node failures
+* Added a set of system views located in "IGNITE" schema to view cluster information (NODES, NODE_ATTRIBUTES, NODE_METRICS, BASELINE_NODES)
+* Added ability to create predefined SQL schemas
+* Added GROUP_CONCAT function support
+* Added string length constraint
+* Custom Java objects are now inlined into primary and secondary indexes what may significantly improve performance when AFFINITY_KEY is used
+* Added timeout to fail query execution in case it cannot be mapped to topology
+* Restricted number of cores allocated for CREATE INDEX by default to 4 to avoid contention on index tree Fixed transaction hanging during runtime error on commit.
+* Fixed possible memory leak when result set size is multiple of the page size
+* Fixed situation when data may be returned from cache partitions in LOST state even when PartitionLossPolicy doesn't permit it
+* Fixed "Caches have distinct sets of data nodes" during SQL JOIN query execution between REPLICATED and PARTITIONED caches
+* Fixed wrong result for SQL queries when item size exceeds the page size
+* Fixed error during SQL query from client node with the local flag set to "true"
+* Fixed handling UUID as a column type
+
+JDBC:
+* Implemented DataSource interface for the thin driver
+
+ODBC:
+* Added streaming mode support
+* Fixed crash in Linux when there are more than 1023 open file descriptors
+* Fixed bug that prevented cursors on a server from being closed
+* Fixed segmentation fault when reusing a closed connection
+
+Web Console:
+* Added new metrics: WAL and Data size on disk
+* Added support for "collocated" query mode on Query screen
+* Added support for Java 9+ for Web Agent.
+* Added ability to show/hide password field value
+* Implemented execution of selected part of SQL query
+* Implemented explain of the selected part of SQL query
+* Implemented connection to a secured cluster
+* Implemented responsive full-screen layout
+* Split "Sign In" page to three separate pages
+* UI updated to modern look and feel
+* Improved backend stability
+* Fixed fail when working with web sockets
+
+REST:
+* Added option IGNITE_REST_GETALL_AS_ARRAY for array format in "getAll" call
+
+Visor:
+* Added output of node "Consistent ID"
+* Visor now collects information about cache groups instead of separate caches to reduce memory consumption
+* Improved help for "start" command
+* Fixed output of cache metrics
+
+Control utility:
+* Added information about transaction start time
+* Added command to collect information about a distribution of partitions
+* Added command to reset lost partitions
+* Added support for empty label (control.sh --tx label null)
+* Added atomicity mode to utility output.
+* Added orphaned local and remote transactions and ability to rollback them
+* Added "--dump" flag to dump current partition state to file.
+* Renamed command argument '--force' to '--yes'
+* Removed "initOrder" and "loc keys" from an info
+* Fixed control utility hanging when connected to a joining node with PME
+
+ML:
+* Added TensorFlow integration
+* Added Estimator API support to TensorFlow cluster on top of Apache Ignite
+* Added ANN algorithm based on ACD concept
+* Added Random Forest algorithm
+* Added OneHotEncoder for categorical features
+* Added model estimation
+* Added K-fold cross-validation for ML models
+* Added splitter for splitting the dataset into test and train subsets
+* Added ability of filtering data during datasets creation
+* Added encoding categorical features with One-of-K Encoder
+* Added MinMax scaler preprocessor
+* Added gradient boosting for trees
+* Added indexing for decision trees
+* Added GDB convergence by error support
+* Added ability to build pipeline of data preprocessing and model training
+* Added ability to start and maintain TensorFlow cluster on top of Apache Ignite
+* Added support of Multi-Class for Logistic Regression
+* Implemented distributed binary logistic regression
+
+Dependency updates:
+* Apache Camel updated to 2.22.0
+* Apache Commons Beanutils updated to 1.9.3
+* Apache Hadoop Yarn updated to 2.7.7
+* Apache Kafka updated to 1.1.0
+* Apache Lucene updated to 7.4.0
+* Apache Mesos updated to 1.5.0
+* Apache Tomcat updated to 9.0.10
+* Apache Zookeeper updated to 3.4.13
+* Guava updated to 25.1-jre
+* Jackson Databind updated to 2.9.6
+* Jackson 1 usages replaced with Jackson 2
+* JCraft updated to 0.1.54
+* H2 version updated to 1.4.197
+* Log4j 2.x updated to 2.11.0
+* Netty updated to 4.1.27.Final
+* RocketMQ updated to 4.3.0
+* Scala 2.10.x was updated to 2.10.7
+* Scala 2.11.x updated to 2.11.12
+
+Apache Ignite In-Memory Database and Caching Platform 2.6
+---------------------------------------------------------
 Ignite:
 * Fixed incorrect calculation of client affinity assignment with baseline.
 * Fixed incorrect calculation of switch segment record in WAL.
@@ -11,8 +163,8 @@ Ignite:
 REST:
 * Fixed serialization of BinaryObjects to JSON.
 
-Apache Ignite In-Memory Data Fabric 2.5
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.5
+---------------------------------------------------------
 Ignite:
 * Implemented Zookeeper discovery SPI.
 * Added Java thin client.
@@ -127,8 +279,8 @@ ML:
 * Implemented Linear SVM for binary classification.
 * Implemented distributed version of SVM (support vector machine) algoritm.
 
-Apache Ignite In-Memory Data Fabric 2.4
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.4
+---------------------------------------------------------
 Ignite:
 * Introduced Baseline Affinity Topology
 * Ability to disable WAL for cache in runtime through IgniteCluster API or ALTER TABLE command
@@ -221,8 +373,8 @@ Visor:
 * Fixed reading last command line in batch mode
 * Updated eviction policy factory in configs
 
-Apache Ignite In-Memory Data Fabric 2.3
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.3
+---------------------------------------------------------
 Ignite:
 * Ability to enable persistence per data region.
 * Default page size is changed to 4KB.
@@ -319,8 +471,8 @@ Visor:
 * Added missing configuration properties to "config" command.
 * Fixed script execution after alert throttling interval.
 
-Apache Ignite In-Memory Data Fabric 2.2
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.2
+---------------------------------------------------------
 Ignite:
 * Checkpointing algorithm optimized
 * Default max memory size changed from 80% to 20%
@@ -329,8 +481,8 @@ Ignite CPP:
 * Now possible to start node with persistent store
 * Ignite.setActive method added to C++ API
 
-Apache Ignite In-Memory Data Fabric 2.1
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.1
+---------------------------------------------------------
 Ignite:
 * Persistent cache store
 * Added IgniteFuture.listenAsync() and IgniteFuture.chainAsync() mehtods
@@ -362,8 +514,8 @@ Web Console:
 * Added option to show full stack trace on Queries screen
 * Added PK alias generation on Models screen.
 
-Apache Ignite In-Memory Data Fabric 2.0
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 2.0
+---------------------------------------------------------
 Ignite:
 * Introduced new page memory architecture
 * Machine Learning beta: distributed algebra support for dense and sparse data sets
@@ -398,8 +550,8 @@ Web Console:
 * Possibility to configure Kubernetes IP finder
 * EnforceJoinOrder option on Queries screen
 
-Apache Ignite In-Memory Data Fabric 1.9
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.9
+---------------------------------------------------------
 Ignite:
 * Added Data streamer mode for DML
 * Added Discovery SPI Implementation for Ignite Kubernetes Pods
@@ -418,8 +570,8 @@ Ignite CPP:
 * Implemented LoadCache
 * ContinuousQuery support
 
-Apache Ignite In-Memory Data Fabric 1.8
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.8
+---------------------------------------------------------
 Ignite:
 * SQL: Added DML operations support (INSERT, UPDATE, DELETE, MERGE)
 * SQL: Improved DISTINCT keyword handling in aggregates
@@ -440,8 +592,8 @@ ODBC driver:
 * Added DSN support
 * Performance improvements
 
-Apache Ignite In-Memory Data Fabric 1.7
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.7
+---------------------------------------------------------
 Ignite:
 * Added distributed SQL JOIN.
 * Node can be assigned as primary only after preloading is finished.
@@ -459,8 +611,8 @@ Ignite.NET:
 Ignite CPP:
 * Marshalling performance improvements.
 
-Apache Ignite In-Memory Data Fabric 1.6
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.6
+---------------------------------------------------------
 Ignite .NET:
 * Added LINQ Provider for cache SQL queries
 * Added native configuration mechanism (C#, app.config, web.config - instead of Spring XML)
@@ -548,8 +700,8 @@ Ignite:
 * Web sessions: user session classes are no longer needed on server nodes.
 * A lot of stability and fault-tolerance fixes.
 
-Apache Ignite In-Memory Data Fabric 1.5
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.5
+---------------------------------------------------------
 * Ignite.NET: Initial Release.
 * Ignite C++: Initial Release.
 * Massive performance improvements for cache operations and SQL.
@@ -571,8 +723,8 @@ Apache Ignite In-Memory Data Fabric 1.5
 
 Complete list of closed issues: https://issues.apache.org/jira/issues/?jql=project%20%3D%20IGNITE%20AND%20fixVersion%20%3D%201.5%20AND%20status%20%3D%20closed
 
-Apache Ignite In-Memory Data Fabric 1.4
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.4
+---------------------------------------------------------
 * Added SSL support to communication and discovery.
 * Added support for log4j2.
 * Added versioned entry to cache API.
@@ -589,8 +741,8 @@ Apache Ignite In-Memory Data Fabric 1.4
 * Fixed affinity routing in compute grid.
 * Many stability and fault-tolerance fixes.
 
-Apache Ignite In-Memory Data Fabric 1.3
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.3
+---------------------------------------------------------
 
 * Added auto-retries for cache operations in recoverable cases.
 * Added integration with Apache YARN.
@@ -603,8 +755,8 @@ Apache Ignite In-Memory Data Fabric 1.3
 * Bug fixes in In-Memory Accelerator For Apache Hadoop.
 * Many stability and fault-tolerance fixes.
 
-Apache Ignite In-Memory Data Fabric 1.2
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.2
+---------------------------------------------------------
 
 * Added client mode to TCP discovery SPI.
 * Added memory based evictions.
@@ -615,8 +767,8 @@ Apache Ignite In-Memory Data Fabric 1.2
 * Bug fixes in In-Memory Accelerator For Apache Hadoop.
 * Many stability and fault-tolerance fixes.
 
-Apache Ignite In-Memory Data Fabric 1.1
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.1
+---------------------------------------------------------
 
 * Added Google Compute Engine TCP discovery IP finder.
 * Added generic cloud TCP discovery IP finder (based on jclouds).
@@ -635,8 +787,8 @@ Apache Ignite In-Memory Data Fabric 1.1
 * Made deployment scanners for URI-based deployment pluggable.
 * Many stability and fault-tolerance fixes.
 
-Apache Ignite In-Memory Data Fabric 1.0
----------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.0
+---------------------------------------------------------
 
 * Simplified query API.
 * Added automatic aggregation, grouping, and sorting support to SQL queries.
@@ -651,14 +803,14 @@ Apache Ignite In-Memory Data Fabric 1.0
 * Added ability to automatically exclude LGPL optional dependencies during build.
 
 
-Apache Ignite In-Memory Data Fabric 1.0 RC3
--------------------------------------------
+Apache Ignite In-Memory Database and Caching Platform 1.0 RC3
+-------------------------------------------------------------
 
 This is the first release of Apache Ignite project. The source code in large part is based
-on the 7 year old GridGain In-Memory Data Fabric, open source edition, v. 6.6.2, which was
+on the 7 year old GridGain In-Memory Database and Caching Platform, open source edition, v. 6.6.2, which was
 donated to Apache Software Foundation in September 2014.
 
-The main feature set of Ignite In-Memory Data Fabric includes:
+The main feature set of Ignite In-Memory Database and Caching Platform includes:
 * Advanced Clustering
 * Compute Grid
 * Data Grid
diff --git a/assembly/LICENSE_FABRIC b/assembly/LICENSE_IGNITE
similarity index 100%
rename from assembly/LICENSE_FABRIC
rename to assembly/LICENSE_IGNITE
diff --git a/assembly/NOTICE_FABRIC b/assembly/NOTICE_IGNITE
similarity index 100%
rename from assembly/NOTICE_FABRIC
rename to assembly/NOTICE_IGNITE
diff --git a/assembly/dependencies-hadoop.xml b/assembly/dependencies-apache-ignite-hadoop.xml
similarity index 100%
rename from assembly/dependencies-hadoop.xml
rename to assembly/dependencies-apache-ignite-hadoop.xml
diff --git a/assembly/dependencies-fabric-lgpl.xml b/assembly/dependencies-apache-ignite-lgpl.xml
similarity index 100%
rename from assembly/dependencies-fabric-lgpl.xml
rename to assembly/dependencies-apache-ignite-lgpl.xml
diff --git a/assembly/dependencies-fabric.xml b/assembly/dependencies-apache-ignite.xml
similarity index 100%
rename from assembly/dependencies-fabric.xml
rename to assembly/dependencies-apache-ignite.xml
diff --git a/assembly/libs/README.txt b/assembly/libs/README.txt
index 8e5f5194653f..1365cc12f5d0 100644
--- a/assembly/libs/README.txt
+++ b/assembly/libs/README.txt
@@ -22,10 +22,10 @@ Importing Ignite Dependencies In Maven Project
 
 If you are using Maven to manage dependencies of your project, there are two options:
 
-1. Import fabric edition:
-  - ignite-fabric (all inclusive)
+1. Import:
+  - apache-ignite (all inclusive)
 
-Here is how 'ignite-fabric' can be added to your POM file (replace '${ignite.version}'
+Here is how 'apache-ignite' can be added to your POM file (replace '${ignite.version}'
 with actual Ignite version you are interested in):
 
 <project xmlns="http://maven.apache.org/POM/4.0.0"
@@ -37,7 +37,7 @@ with actual Ignite version you are interested in):
         ...
         <dependency>
             <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-fabric</artifactId>
+            <artifactId>apache-ignite</artifactId>
             <version>${ignite.version}</version>
         </dependency>
         ...
diff --git a/assembly/release-fabric-base.xml b/assembly/release-apache-ignite-base.xml
similarity index 77%
rename from assembly/release-fabric-base.xml
rename to assembly/release-apache-ignite-base.xml
index efc643e955d8..91baf7327ae6 100644
--- a/assembly/release-fabric-base.xml
+++ b/assembly/release-apache-ignite-base.xml
@@ -47,15 +47,53 @@
             <destName>Makefile.am</destName>
         </file>
 
+        <!-- Copy Node.js files. -->
+        <file>
+            <source>modules/platforms/nodejs/index.js</source>
+            <outputDirectory>/platforms/nodejs</outputDirectory>
+        </file>
+
+        <file>
+            <source>modules/platforms/nodejs/package.json</source>
+            <outputDirectory>/platforms/nodejs</outputDirectory>
+        </file>
+
+        <file>
+            <source>modules/platforms/nodejs/README.md</source>
+            <outputDirectory>/platforms/nodejs</outputDirectory>
+        </file>
+
+        <!-- Copy PHP files. -->
+        <file>
+            <source>modules/platforms/php/composer.json</source>
+            <outputDirectory>/platforms/php</outputDirectory>
+        </file>
+
+        <!-- Copy Python files. -->
+        <file>
+            <source>modules/platforms/python/LICENSE</source>
+            <outputDirectory>/platforms/python</outputDirectory>
+        </file>
+
+        <file>
+            <source>modules/platforms/python/README.md</source>
+            <outputDirectory>/platforms/python</outputDirectory>
+        </file>
+
+        <file>
+            <source>modules/platforms/python/setup.py</source>
+            <outputDirectory>/platforms/python</outputDirectory>
+        </file>
+
         <!-- Other files. -->
         <file>
-            <source>assembly/LICENSE_FABRIC</source>
+            <source>assembly/LICENSE_IGNITE</source>
             <destName>LICENSE</destName>
             <outputDirectory>/</outputDirectory>
         </file>
 
         <file>
-            <source>assembly/NOTICE_FABRIC</source>
+            <source>assembly/NOTICE_IGNITE</source>
             <destName>NOTICE</destName>
             <outputDirectory>/</outputDirectory>
         </file>
@@ -192,6 +230,39 @@
             <outputDirectory>/platforms/cpp/bin</outputDirectory>
         </fileSet>
 
+        <!-- Copy Node.js binaries. -->
+        <fileSet>
+            <directory>modules/platforms/nodejs/lib</directory>
+            <outputDirectory>/platforms/nodejs/lib</outputDirectory>
+        </fileSet>
+
+        <fileSet>
+            <directory>modules/platforms/nodejs/examples</directory>
+            <outputDirectory>/platforms/nodejs/examples</outputDirectory>
+        </fileSet>
+
+        <!-- Copy PHP sources. -->
+        <fileSet>
+            <directory>modules/platforms/php/src</directory>
+            <outputDirectory>/platforms/php/src</outputDirectory>
+        </fileSet>
+
+        <fileSet>
+            <directory>modules/platforms/php/examples</directory>
+            <outputDirectory>/platforms/php/examples</outputDirectory>
+        </fileSet>
+
+        <!-- Copy Python sources. -->
+        <fileSet>
+            <directory>modules/platforms/python/pyignite</directory>
+            <outputDirectory>/platforms/python/pyignite</outputDirectory>
+        </fileSet>
+
+        <fileSet>
+            <directory>modules/platforms/python/requirements</directory>
+            <outputDirectory>/platforms/python/requirements</outputDirectory>
+        </fileSet>
+
         <!-- Other files. -->
         <fileSet>
             <directory>bin</directory>
diff --git a/assembly/release-hadoop.xml b/assembly/release-apache-ignite-hadoop.xml
similarity index 100%
rename from assembly/release-hadoop.xml
rename to assembly/release-apache-ignite-hadoop.xml
diff --git a/assembly/release-fabric-lgpl.xml b/assembly/release-apache-ignite-lgpl.xml
similarity index 94%
rename from assembly/release-fabric-lgpl.xml
rename to assembly/release-apache-ignite-lgpl.xml
index ff4d8c46952a..8777ea3efba3 100644
--- a/assembly/release-fabric-lgpl.xml
+++ b/assembly/release-apache-ignite-lgpl.xml
@@ -21,7 +21,7 @@
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
           http://maven.apache.org/xsd/assembly-1.1.2.xsd">
-    <id>fabric-lgpl</id>
+    <id>apache-ignite-lgpl</id>
 
     <includeBaseDirectory>false</includeBaseDirectory>
 
@@ -31,7 +31,7 @@
 
     <componentDescriptors>
         <componentDescriptor>release-base.xml</componentDescriptor>
-        <componentDescriptor>release-fabric-base.xml</componentDescriptor>
+        <componentDescriptor>release-apache-ignite-base.xml</componentDescriptor>
         <componentDescriptor>release-yardstick.xml</componentDescriptor>
     </componentDescriptors>
 
diff --git a/assembly/release-fabric.xml b/assembly/release-apache-ignite.xml
similarity index 94%
rename from assembly/release-fabric.xml
rename to assembly/release-apache-ignite.xml
index 7536d4ec5118..a8159167ac81 100644
--- a/assembly/release-fabric.xml
+++ b/assembly/release-apache-ignite.xml
@@ -21,7 +21,7 @@
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
           http://maven.apache.org/xsd/assembly-1.1.2.xsd">
-    <id>fabric</id>
+    <id>apache-ignite</id>
 
     <includeBaseDirectory>false</includeBaseDirectory>
 
@@ -31,7 +31,7 @@
 
     <componentDescriptors>
         <componentDescriptor>release-base.xml</componentDescriptor>
-        <componentDescriptor>release-fabric-base.xml</componentDescriptor>
+        <componentDescriptor>release-apache-ignite-base.xml</componentDescriptor>
         <componentDescriptor>release-yardstick.xml</componentDescriptor>
     </componentDescriptors>
 
diff --git a/assembly/release-sources.xml b/assembly/release-sources.xml
deleted file mode 100644
index cc33f3e83719..000000000000
--- a/assembly/release-sources.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?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.
--->
-
-<assembly>
-    <id>source-release</id>
-    <formats>
-        <format>zip</format>
-    </formats>
-
-    <fileSets>
-        <!-- main project directory structure -->
-        <fileSet>
-            <directory>.</directory>
-            <outputDirectory>/</outputDirectory>
-            <useDefaultExcludes>true</useDefaultExcludes>
-            <excludes>
-                <!-- build output -->
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/).*${project.build.directory}/.*]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/).*${project.build.directory}]</exclude>
-
-                <!-- NOTE: Most of the following excludes should not be required
-                     if the standard release process is followed. This is because the
-                     release plugin checks out project sources into a location like
-                     target/checkout, then runs the build from there. The result is
-                     a source-release archive that comes from a pretty clean directory
-                     structure.
-
-                     HOWEVER, if the release plugin is configured to run extra goals
-                     or generate a project website, it's definitely possible that some
-                     of these files will be present. So, it's safer to exclude them.
-                -->
-
-                <!-- IDEs -->
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?maven-eclipse\.xml]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.project]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.classpath]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.iws]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.idea(/.*)?]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?out(/.*)?]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.ipr]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.iml]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.settings(/.*)?]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.externalToolBuilders(/.*)?]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.deployables(/.*)?]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.wtpmodules(/.*)?]</exclude>
-
-                <!-- misc -->
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?cobertura\.ser]</exclude>
-
-                <!-- release-plugin temp files -->
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?pom\.xml\.releaseBackup]</exclude>
-                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?release\.properties]</exclude>
-
-                <!-- dotnet assemblies -->
-                <exclude>modules/platforms/dotnet/bin/**</exclude>
-            </excludes>
-        </fileSet>
-        <!-- license, readme, etc. calculated at build time -->
-        <fileSet>
-            <directory>${project.build.directory}/maven-shared-archive-resources/META-INF</directory>
-            <outputDirectory>/</outputDirectory>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/bin/control.bat b/bin/control.bat
index 6b36a923d810..d6f97984e213 100644
--- a/bin/control.bat
+++ b/bin/control.bat
@@ -28,7 +28,7 @@ if "%OS%" == "Windows_NT"  setlocal
 if defined JAVA_HOME  goto checkJdk
     echo %0, ERROR:
     echo JAVA_HOME environment variable is not found.
-    echo Please point JAVA_HOME variable to location of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to location of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 goto error_finish
 
@@ -37,7 +37,7 @@ goto error_finish
 if exist "%JAVA_HOME%\bin\java.exe" goto checkJdkVersion
     echo %0, ERROR:
     echo JAVA is not found in JAVA_HOME=%JAVA_HOME%.
-    echo Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to installation of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 goto error_finish
 
@@ -58,7 +58,7 @@ if %MAJOR_JAVA_VER% == 1 set MAJOR_JAVA_VER=%MINOR_JAVA_VER%
 if %MAJOR_JAVA_VER% LSS 8 (
     echo %0, ERROR:
     echo The version of JAVA installed in %JAVA_HOME% is incorrect.
-    echo Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to installation of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 	goto error_finish
 )
diff --git a/bin/ignite-tf.sh b/bin/ignite-tf.sh
new file mode 100644
index 000000000000..a6499ae45eb6
--- /dev/null
+++ b/bin/ignite-tf.sh
@@ -0,0 +1,183 @@
+#!/bin/bash
+#
+# 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.
+#
+
+#
+# Command line tool for Tensorflow cluster management.
+#
+
+#
+# Import common functions.
+#
+if [ "${IGNITE_HOME}" = "" ];
+    then IGNITE_HOME_TMP="$(dirname "$(cd "$(dirname "$0")"; "pwd")")";
+    else IGNITE_HOME_TMP=${IGNITE_HOME};
+fi
+
+#
+# Set SCRIPTS_HOME - base path to scripts.
+#
+SCRIPTS_HOME="${IGNITE_HOME_TMP}/bin"
+
+source "${SCRIPTS_HOME}"/include/functions.sh
+
+#
+# Discover path to Java executable and check it's version.
+#
+checkJava
+
+#
+# Discover IGNITE_HOME environment variable.
+#
+setIgniteHome
+
+if [ "${DEFAULT_CONFIG}" == "" ]; then
+    DEFAULT_CONFIG=config/default-config.xml
+fi
+
+#
+# Set IGNITE_LIBS.
+#
+. "${SCRIPTS_HOME}"/include/setenv.sh
+. "${SCRIPTS_HOME}"/include/build-classpath.sh # Will be removed in the binary release.
+IGNITE_OPT_LIBS=${IGNITE_HOME}/libs/optional/
+CP="${IGNITE_LIBS}:${IGNITE_OPT_LIBS}/ignite-tensorflow/*:${IGNITE_OPT_LIBS}/ignite-slf4j/*"
+
+RANDOM_NUMBER=$("$JAVA" -cp "${CP}" org.apache.ignite.startup.cmdline.CommandLineRandomNumberGenerator)
+
+RESTART_SUCCESS_FILE="${IGNITE_HOME}/work/ignite_success_${RANDOM_NUMBER}"
+RESTART_SUCCESS_OPT="-DIGNITE_SUCCESS_FILE=${RESTART_SUCCESS_FILE}"
+
+# Mac OS specific support to display correct name in the dock.
+osname=`uname`
+
+if [ "${DOCK_OPTS}" == "" ]; then
+    DOCK_OPTS="-Xdock:name=Ignite Node"
+fi
+
+#
+# JVM options. See http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp for more details.
+#
+# ADD YOUR/CHANGE ADDITIONAL OPTIONS HERE
+#
+if [ -z "$JVM_OPTS" ] ; then
+    JVM_OPTS="-Xms1g -Xmx1g -server -XX:MaxMetaspaceSize=256m"
+fi
+
+#
+# Uncomment the following GC settings if you see spikes in your throughput due to Garbage Collection.
+#
+# JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
+
+#
+# Uncomment if you get StackOverflowError.
+# On 64 bit systems this value can be larger, e.g. -Xss16m
+#
+# JVM_OPTS="${JVM_OPTS} -Xss4m"
+
+#
+# Uncomment to set preference for IPv4 stack.
+#
+# JVM_OPTS="${JVM_OPTS} -Djava.net.preferIPv4Stack=true"
+
+#
+# Assertions are disabled by default since version 3.5.
+# If you want to enable them - set 'ENABLE_ASSERTIONS' flag to '1'.
+#
+ENABLE_ASSERTIONS="1"
+
+#
+# Set '-ea' options if assertions are enabled.
+#
+if [ "${ENABLE_ASSERTIONS}" = "1" ]; then
+    JVM_OPTS="${JVM_OPTS} -ea"
+fi
+
+MAIN_CLASS=org.apache.ignite.tensorflow.submitter.JobSubmitter
+
+#
+# Remote debugging (JPDA).
+# Uncomment and change if remote debugging is required.
+#
+# JVM_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8787 ${JVM_OPTS}"
+
+#
+# Final JVM_OPTS for Java 9+ compatibility
+#
+javaMajorVersion "${JAVA_HOME}/bin/java"
+
+if [ $version -eq 8 ] ; then
+    JVM_OPTS="\
+        -XX:+AggressiveOpts \
+         ${JVM_OPTS}"
+
+elif [ $version -gt 8 ] && [ $version -lt 11 ]; then
+    JVM_OPTS="\
+        -XX:+AggressiveOpts \
+        --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
+        --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
+        --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
+        --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
+        --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
+        --illegal-access=permit \
+        --add-modules=java.transaction \
+        --add-modules=java.xml.bind \
+        ${JVM_OPTS}"
+
+elif [ $version -eq 11 ] ; then
+    JVM_OPTS="\
+        --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
+        --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
+        --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
+        --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
+        --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
+        --illegal-access=permit \
+        ${JVM_OPTS}"
+fi
+
+
+ERRORCODE="-1"
+
+QUIET="-DIGNITE_QUIET=false"
+
+while [ "${ERRORCODE}" -ne "130" ]
+do
+    case $osname in
+        Darwin*)
+            "$JAVA" ${JVM_OPTS} ${QUIET} "${DOCK_OPTS}" "${RESTART_SUCCESS_OPT}"  \
+             -DIGNITE_UPDATE_NOTIFIER=false -DIGNITE_HOME="${IGNITE_HOME}" \
+             -DIGNITE_PROG_NAME="$0" -cp "${CP}" ${MAIN_CLASS} "${CONFIG}" "$@"
+        ;;
+        *)
+            "$JAVA" ${JVM_OPTS} ${QUIET} "${RESTART_SUCCESS_OPT}" \
+             -DIGNITE_UPDATE_NOTIFIER=false -DIGNITE_HOME="${IGNITE_HOME}" \
+             -DIGNITE_PROG_NAME="$0" -cp "${CP}" ${MAIN_CLASS} "$@"
+        ;;
+    esac
+
+    ERRORCODE="$?"
+
+    if [ ! -f "${RESTART_SUCCESS_FILE}" ] ; then
+        break
+    else
+        rm -f "${RESTART_SUCCESS_FILE}"
+    fi
+done
+
+if [ -f "${RESTART_SUCCESS_FILE}" ] ; then
+    rm -f "${RESTART_SUCCESS_FILE}"
+fi
diff --git a/bin/ignite.bat b/bin/ignite.bat
index 25c828fec9e0..2d5a08d3a9e4 100644
--- a/bin/ignite.bat
+++ b/bin/ignite.bat
@@ -28,7 +28,7 @@ if "%OS%" == "Windows_NT"  setlocal
 if defined JAVA_HOME  goto checkJdk
     echo %0, ERROR:
     echo JAVA_HOME environment variable is not found.
-    echo Please point JAVA_HOME variable to location of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to location of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 goto error_finish
 
@@ -37,7 +37,7 @@ goto error_finish
 if exist "%JAVA_HOME%\bin\java.exe" goto checkJdkVersion
     echo %0, ERROR:
     echo JAVA is not found in JAVA_HOME=%JAVA_HOME%.
-    echo Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to installation of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 goto error_finish
 
@@ -49,27 +49,20 @@ for /f "tokens=* USEBACKQ" %%f in (`%cmd% -version 2^>^&1`) do (
 )
 :LoopEscape
 
-set var=%var:~14%
-set var=%var:"=%
-for /f "tokens=1,2 delims=." %%a in ("%var%") do set MAJOR_JAVA_VER=%%a & set MINOR_JAVA_VER=%%b
+for /f "tokens=1-3  delims= " %%a in ("%var%") do set JAVA_VER_STR=%%c
+set JAVA_VER_STR=%JAVA_VER_STR:"=%
 
+for /f "tokens=1,2 delims=." %%a in ("%JAVA_VER_STR%.x") do set MAJOR_JAVA_VER=%%a & set MINOR_JAVA_VER=%%b
 if %MAJOR_JAVA_VER% == 1 set MAJOR_JAVA_VER=%MINOR_JAVA_VER%
 
 if %MAJOR_JAVA_VER% LSS 8 (
     echo %0, ERROR:
     echo The version of JAVA installed in %JAVA_HOME% is incorrect.
-    echo Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to installation of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 	goto error_finish
 )
 
-if %MAJOR_JAVA_VER% GTR 9 (
-	echo %0, WARNING:
-    echo The version of JAVA installed in %JAVA_HOME% was not tested with Apache Ignite.
-    echo Run it on your own risk or point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
-    echo You can also download latest JDK at http://java.com/download.
-)
-
 :: Check IGNITE_HOME.
 :checkIgniteHome1
 if defined IGNITE_HOME goto checkIgniteHome2
@@ -181,9 +174,9 @@ if "%JMX_PORT%" == "" (
 ::
 "%JAVA_HOME%\bin\java.exe" -version 2>&1 | findstr "1\.[7]\." > nul
 if %ERRORLEVEL% equ 0 (
-    if "%JVM_OPTS%" == "" set JVM_OPTS=-Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxPermSize=256m
+    if "%JVM_OPTS%" == "" set JVM_OPTS=-Xms1g -Xmx1g -server -XX:MaxPermSize=256m
 ) else (
-    if "%JVM_OPTS%" == "" set JVM_OPTS=-Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxMetaspaceSize=256m
+    if "%JVM_OPTS%" == "" set JVM_OPTS=-Xms1g -Xmx1g -server -XX:MaxMetaspaceSize=256m
 )
 
 ::
@@ -235,7 +228,36 @@ if "%MAIN_CLASS%" == "" set MAIN_CLASS=org.apache.ignite.startup.cmdline.Command
 ::
 :: Final JVM_OPTS for Java 9+ compatibility
 ::
-if %MAJOR_JAVA_VER% GEQ 9 set JVM_OPTS=--add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-exports java.base/sun.nio.ch=ALL-UNNAMED --add-exports java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED --add-exports jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED --add-modules java.xml.bind %JVM_OPTS%
+if "%MAJOR_JAVA_VER%" == "8" (
+    set JVM_OPTS= ^
+    -XX:+AggressiveOpts ^
+    %JVM_OPTS%
+)
+
+if %MAJOR_JAVA_VER% GEQ 9 if %MAJOR_JAVA_VER% LSS 11 (
+    set JVM_OPTS= ^
+    -XX:+AggressiveOpts ^
+    --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED ^
+    --add-exports=java.base/sun.nio.ch=ALL-UNNAMED ^
+    --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED ^
+    --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED ^
+    --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED ^
+    --illegal-access=permit ^
+    --add-modules=java.transaction ^
+    --add-modules=java.xml.bind ^
+    %JVM_OPTS%
+)
+
+if "%MAJOR_JAVA_VER%" == "11" (
+    set JVM_OPTS= ^
+    --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED ^
+    --add-exports=java.base/sun.nio.ch=ALL-UNNAMED ^
+    --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED ^
+    --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED ^
+    --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED ^
+    --illegal-access=permit ^
+    %JVM_OPTS%
+)
 
 if "%INTERACTIVE%" == "1" (
     "%JAVA_HOME%\bin\java.exe" %JVM_OPTS% %QUIET% %RESTART_SUCCESS_OPT% %JMX_MON% ^
diff --git a/bin/ignite.sh b/bin/ignite.sh
index c7b7318190d0..8ef040cdb711 100755
--- a/bin/ignite.sh
+++ b/bin/ignite.sh
@@ -90,7 +90,7 @@ fi
 # ADD YOUR/CHANGE ADDITIONAL OPTIONS HERE
 #
 if [ -z "$JVM_OPTS" ] ; then
-    JVM_OPTS="-Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxMetaspaceSize=256m"
+    JVM_OPTS="-Xms1g -Xmx1g -server -XX:MaxMetaspaceSize=256m"
 fi
 
 #
@@ -149,15 +149,36 @@ fi
 #
 javaMajorVersion "${JAVA_HOME}/bin/java"
 
-if [ $version -gt 8 ]; then
-    JVM_OPTS="--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
-          --add-exports java.base/sun.nio.ch=ALL-UNNAMED \
-          --add-exports java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
-          --add-exports jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
-          --add-modules java.xml.bind \
-      ${JVM_OPTS}"
+if [ $version -eq 8 ] ; then
+    JVM_OPTS="\
+        -XX:+AggressiveOpts \
+         ${JVM_OPTS}"
+
+elif [ $version -gt 8 ] && [ $version -lt 11 ]; then
+    JVM_OPTS="\
+        -XX:+AggressiveOpts \
+        --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
+        --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
+        --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
+        --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
+        --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
+        --illegal-access=permit \
+        --add-modules=java.transaction \
+        --add-modules=java.xml.bind \
+        ${JVM_OPTS}"
+
+elif [ $version -eq 11 ] ; then
+    JVM_OPTS="\
+        --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
+        --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
+        --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
+        --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
+        --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
+        --illegal-access=permit \
+        ${JVM_OPTS}"
 fi
 
+
 ERRORCODE="-1"
 
 while [ "${ERRORCODE}" -ne "130" ]
diff --git a/bin/ignitevisorcmd.bat b/bin/ignitevisorcmd.bat
index 86e688f8698e..82238c2d3885 100644
--- a/bin/ignitevisorcmd.bat
+++ b/bin/ignitevisorcmd.bat
@@ -28,7 +28,7 @@ if "%OS%" == "Windows_NT"  setlocal
 if defined JAVA_HOME  goto checkJdk
     echo %0, ERROR:
     echo JAVA_HOME environment variable is not found.
-    echo Please point JAVA_HOME variable to location of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to location of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 goto error_finish
 
@@ -37,7 +37,7 @@ goto error_finish
 if exist "%JAVA_HOME%\bin\java.exe" goto checkJdkVersion
     echo %0, ERROR:
     echo JAVA is not found in JAVA_HOME=%JAVA_HOME%.
-    echo Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to installation of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 goto error_finish
 
@@ -58,7 +58,7 @@ if %MAJOR_JAVA_VER% == 1 set MAJOR_JAVA_VER=%MINOR_JAVA_VER%
 if %MAJOR_JAVA_VER% LSS 8 (
     echo %0, ERROR:
     echo The %MAJOR_JAVA_VER% version of JAVA installed in %JAVA_HOME% is incorrect.
-    echo Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9.
+    echo Please point JAVA_HOME variable to installation of JDK 1.8 or later.
     echo You can also download latest JDK at http://java.com/download.
 	goto error_finish
 )
diff --git a/bin/include/functions.sh b/bin/include/functions.sh
index dbeee1112b0b..7bdcefd8cf4d 100755
--- a/bin/include/functions.sh
+++ b/bin/include/functions.sh
@@ -62,7 +62,7 @@ checkJava() {
         if [ $RETCODE -ne 0 ]; then
             echo $0", ERROR:"
             echo "JAVA_HOME environment variable is not found."
-            echo "Please point JAVA_HOME variable to location of JDK 1.8 or JDK 9."
+            echo "Please point JAVA_HOME variable to location of JDK 1.8 or later."
             echo "You can also download latest JDK at http://java.com/download"
 
             exit 1
@@ -81,14 +81,9 @@ checkJava() {
     if [ $version -lt 8 ]; then
         echo "$0, ERROR:"
         echo "The $version version of JAVA installed in JAVA_HOME=$JAVA_HOME is incompatible."
-        echo "Please point JAVA_HOME variable to installation of JDK 1.8 or JDK 9."
+        echo "Please point JAVA_HOME variable to installation of JDK 1.8 or later."
         echo "You can also download latest JDK at http://java.com/download"
         exit 1
-    elif [ $version -gt 9 ]; then
-        echo "$0, WARNING:"
-        echo "The $version version of JAVA installed in JAVA_HOME=$JAVA_HOME was not tested with Apache Ignite."
-        echo "Run it on your own risk or point JAVA_HOME variable to installation of JDK 1.8 or JDK 9."
-        echo "You can also download JDK at http://java.com/download"
     fi
 }
 
diff --git a/config/fabric-lgpl/default-config.xml b/config/apache-ignite-lgpl/default-config.xml
similarity index 100%
rename from config/fabric-lgpl/default-config.xml
rename to config/apache-ignite-lgpl/default-config.xml
diff --git a/config/fabric/default-config.xml b/config/apache-ignite/default-config.xml
similarity index 100%
rename from config/fabric/default-config.xml
rename to config/apache-ignite/default-config.xml
diff --git a/bin/include/visorcmd/node_startup_by_ssh.sample.ini b/config/visor-cmd/node_startup_by_ssh.sample.ini
similarity index 85%
rename from bin/include/visorcmd/node_startup_by_ssh.sample.ini
rename to config/visor-cmd/node_startup_by_ssh.sample.ini
index e50ff2993045..f1d8e01b7b95 100644
--- a/bin/include/visorcmd/node_startup_by_ssh.sample.ini
+++ b/config/visor-cmd/node_startup_by_ssh.sample.ini
@@ -13,6 +13,11 @@
 ;See the License for the specific language governing permissions and
 ;limitations under the License.
 
+# ==================================================================
+# This is a sample file for Visor CMD to use with "start" command.
+# More info: https://apacheignite-tools.readme.io/docs/start-command
+# ==================================================================
+
 # Section with settings for host1:
 [host1]
 # IP address or host name:
diff --git a/doap_Ignite.rdf b/doap_Ignite.rdf
index 16649c404f16..4d5daa41c847 100644
--- a/doap_Ignite.rdf
+++ b/doap_Ignite.rdf
@@ -27,8 +27,8 @@
     <name>Apache Ignite</name>
     <homepage rdf:resource="http://ignite.apache.org" />
     <asfext:pmc rdf:resource="http://ignite.apache.org" />
-    <shortdesc>Apache Ignite is an In-Memory Data Fabric providing in-memory data caching, partitioning, processing, and querying components.</shortdesc>
-    <description>Apache Ignite In-Memory Data Fabric is designed to deliver uncompromised performance for a wide set of in-memory computing use cases from high performance computing, to the industry most advanced data grid, in-memory SQL, in-memory file system, streaming, and more.</description>
+    <shortdesc>Apache Ignite is an In-Memory Database and Caching Platform providing in-memory data caching, partitioning, processing, and querying components.</shortdesc>
+    <description>Apache Ignite In-Memory Database and Caching Platform is designed to deliver uncompromised performance for a wide set of in-memory computing use cases from high performance computing, to the industry most advanced data grid, in-memory SQL, in-memory file system, streaming, and more.</description>
     <bug-database rdf:resource="https://issues.apache.org/jira/browse/IGNITE" />
     <mailing-list rdf:resource="https://ignite.apache.org/community/resources.html#mail-lists" />
     <download-page rdf:resource="https://ignite.apache.org/download" />
diff --git a/docker/apache-ignite/Dockerfile b/docker/apache-ignite/Dockerfile
index 15b5c3eafba5..148ce421f708 100644
--- a/docker/apache-ignite/Dockerfile
+++ b/docker/apache-ignite/Dockerfile
@@ -19,7 +19,7 @@
 FROM openjdk:8-jre-alpine
 
 # Settings
-ENV IGNITE_HOME /opt/ignite/apache-ignite-fabric
+ENV IGNITE_HOME /opt/ignite/apache-ignite
 WORKDIR /opt/ignite
 
 # Add missing software
@@ -27,7 +27,7 @@ RUN apk --no-cache \
     add bash
 
 # Copy main binary archive
-COPY apache-ignite-fabric* apache-ignite-fabric
+COPY apache-ignite* apache-ignite
 
 # Copy sh files and set permission
 COPY run.sh $IGNITE_HOME/
diff --git a/docker/apache-ignite/README.txt b/docker/apache-ignite/README.txt
index 6912bc4745e4..98d67b283d81 100644
--- a/docker/apache-ignite/README.txt
+++ b/docker/apache-ignite/README.txt
@@ -13,11 +13,11 @@ Build image
 
 3) Copy Apache Ignite's binary archive to Docker module directory
 
-        cp -rfv ../../target/bin/apache-ignite-fabric-*.zip
+        cp -rfv ../../target/bin/apache-ignite-*.zip
 
 4) Unpack Apache Ignite's binary archive
 
-        unzip apache-ignite-fabric-*.zip
+        unzip apache-ignite-*.zip
 
 5) Build docker image
 
diff --git a/modules/web-console/docker/standalone/Dockerfile b/docker/web-console/standalone/Dockerfile
similarity index 53%
rename from modules/web-console/docker/standalone/Dockerfile
rename to docker/web-console/standalone/Dockerfile
index 9b007349b6a6..dfcb188b2dac 100644
--- a/modules/web-console/docker/standalone/Dockerfile
+++ b/docker/web-console/standalone/Dockerfile
@@ -15,62 +15,71 @@
 # limitations under the License.
 #
 
+
+#~~~~~~~~~~~~~~~~~~#
+#  Frontend build  #
+#~~~~~~~~~~~~~~~~~~#
 FROM node:8-slim as frontend-build
 
 ENV NPM_CONFIG_LOGLEVEL error
 
 WORKDIR /opt/web-console
 
-# Install node modules for frontend.
-COPY frontend/package*.json frontend/
-RUN (cd frontend && npm install --no-optional)
-
-# Copy source.
+# Install node modules and build sources
 COPY frontend frontend
+RUN cd frontend && \
+    npm install --no-optional && \
+    npm run build
 
-RUN (cd frontend && npm run build)
 
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
+#  Web Console Standalone assemble  #
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
 FROM node:8-slim
 
 ENV NPM_CONFIG_LOGLEVEL error
 
-# Update package list & install.
-RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 \
-    && echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list
-
-# Update package list & install.
-RUN apt-get update \
-    && apt-get install -y nginx-light mongodb-org-server dos2unix \
-    && apt-get clean \
-    && rm -rf /var/lib/apt/lists/*
-
-# Install global node packages.
+# Install global node packages
 RUN npm install -g pm2
 
-WORKDIR /opt/web-console
-
-COPY docker/standalone/docker-entrypoint.sh docker-entrypoint.sh
+# Update software sources and install missing applications
+RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 && \
+    echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" > /etc/apt/sources.list.d/mongodb-org-3.4.list && \
+    apt update && \
+    apt install -y --no-install-recommends \
+        nginx-light \
+        mongodb-org-server \
+        dos2unix && \
+    apt-get clean && \
+    rm -rf /var/lib/apt/lists/*
 
-RUN chmod +x docker-entrypoint.sh \
-    && dos2unix docker-entrypoint.sh
-
-# Copy nginx config.
-COPY docker/standalone/nginx/* /etc/nginx/
+WORKDIR /opt/web-console
 
-# Install node modules for frontend and backend modules.
+# Install node modules for backend
 COPY backend/package*.json backend/
-RUN (cd backend && npm install --no-optional --production)
+RUN cd backend && \
+    npm install --no-optional --production
 
-# Copy source.
+# Copy and build sources
 COPY backend backend
+RUN cd backend && \
+    npm run build
 
-COPY web-agent/target/ignite-web-agent-*.zip backend/agent_dists
+# Copy Ignite Web Agent module package
+COPY ignite-web-agent-*.zip backend/agent_dists
 
+# Copy previously built frontend
 COPY --from=frontend-build /opt/web-console/frontend/build static
 
-VOLUME ["/etc/nginx"]
-VOLUME ["/data/db"]
-VOLUME ["/opt/web-console/serve/agent_dists"]
+# Copy and fix entrypoint script
+COPY docker-entrypoint.sh docker-entrypoint.sh
+RUN chmod +x docker-entrypoint.sh \
+    && dos2unix docker-entrypoint.sh
+
+# Copy nginx configuration
+COPY nginx/* /etc/nginx/
 
 EXPOSE 80
+
 ENTRYPOINT ["/opt/web-console/docker-entrypoint.sh"]
+
diff --git a/docker/web-console/standalone/README.txt b/docker/web-console/standalone/README.txt
new file mode 100644
index 000000000000..c97e7924fbdc
--- /dev/null
+++ b/docker/web-console/standalone/README.txt
@@ -0,0 +1,35 @@
+Apache Ignite Web Console Standalone Docker module
+==================================================
+Apache Ignite Web Console Standalone Docker module provides Dockerfile and accompanying files
+for building docker image of Web Console.
+
+
+Ignite Web Console Standalone Docker Image Build Instructions
+=============================================================
+1) Build ignite-web-console module
+
+        mvn clean install -P web-console -DskipTests -T 2C -pl :ignite-web-console -am
+
+2) Copy ignite-web-agent-<version>.zip from 'modules/web-console/web-agent/target'
+   to 'docker/web-console/standalone' directory
+
+        cp -rf modules/web-console/web-agent/target/ignite-web-agent-*.zip docker/web-console/standalone
+
+3) Go to Apache Ignite Web Console Docker module directory and copy Apache
+   Ignite Web Console's frontend and backend directory
+
+        cd docker/web-console/standalone
+        cp -rf ../../../modules/web-console/backend ./
+        cp -rf ../../../modules/web-console/frontend ./
+
+4) Build docker image
+
+        docker build . -t apacheignite/web-console-standalone:[:<version>]
+
+   Prepared image will be available in local docker registry (can be seen
+   issuing `docker images` command)
+
+5) Clean up
+
+        rm -rf backend frontend ignite-web-agent*
+
diff --git a/modules/web-console/docker/standalone/docker-entrypoint.sh b/docker/web-console/standalone/docker-entrypoint.sh
similarity index 100%
rename from modules/web-console/docker/standalone/docker-entrypoint.sh
rename to docker/web-console/standalone/docker-entrypoint.sh
diff --git a/modules/web-console/docker/standalone/nginx/nginx.conf b/docker/web-console/standalone/nginx/nginx.conf
similarity index 100%
rename from modules/web-console/docker/standalone/nginx/nginx.conf
rename to docker/web-console/standalone/nginx/nginx.conf
diff --git a/modules/web-console/docker/standalone/nginx/web-console.conf b/docker/web-console/standalone/nginx/web-console.conf
similarity index 100%
rename from modules/web-console/docker/standalone/nginx/web-console.conf
rename to docker/web-console/standalone/nginx/web-console.conf
diff --git a/examples/README.txt b/examples/README.txt
index 9da74a8af273..abb5d23b115d 100644
--- a/examples/README.txt
+++ b/examples/README.txt
@@ -36,6 +36,6 @@ There are some ways to gain required libs from sources:
 1) Run "mvn clean install -DskipTests -P lgpl" at Apache Ignite sources.
 This case will install lgpl-based libs to local maven repository.
 
-2) Run "mvn clean package -DskipTests -Prelease,lgpl -Dignite.edition=fabric-lgpl" at Apache Ignite sources.
+2) Run "mvn clean package -DskipTests -Prelease,lgpl -Dignite.edition=apache-ignite-lgpl" at Apache Ignite sources.
 Required libs will appear at /target/release-package/libs/optional subfolders.
 Found libs should be copied to global or project's classpath.
diff --git a/examples/config/encryption/example-encrypted-store.xml b/examples/config/encryption/example-encrypted-store.xml
new file mode 100644
index 000000000000..7ce5482ad5ca
--- /dev/null
+++ b/examples/config/encryption/example-encrypted-store.xml
@@ -0,0 +1,71 @@
+<?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.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd">
+    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+        <!-- Enabling Apache Ignite Persistent Store. -->
+        <property name="dataStorageConfiguration">
+            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
+                <property name="defaultDataRegionConfiguration">
+                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
+                        <property name="persistenceEnabled" value="true"/>
+
+                        <property name="maxSize" value="#{128 * 1024 * 1024}"/>
+                    </bean>
+                </property>
+            </bean>
+        </property>
+
+        <!-- We need to configure EncryptionSpi to enable encryption feature. -->
+        <property name="encryptionSpi">
+            <!-- Using EncryptionSpi implementation based on java keystore. -->
+            <bean class="org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi">
+                <!-- Path to the keystore file. -->
+                <property name="keyStorePath" value="encryption/example_keystore.jks" />
+                <!-- Password to access to keystore file. -->
+                <property name="keyStorePassword" value="jks_password" />
+                <!-- Name of the key inside keystore. It will be used as a master key. -->
+                <property name="masterKeyName" value="ignite.master.key" />
+                <!-- Size of master and cache keys in bits. -->
+                <property name="keySize" value="256" />
+            </bean>
+        </property>
+
+        <!-- Explicitly configure TCP discovery SPI to provide a list of initial nodes. -->
+        <property name="discoverySpi">
+            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+                <property name="ipFinder">
+                    <!-- Uncomment static IP finder to enable static-based discovery of initial nodes. -->
+                    <!--<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">-->
+                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
+                        <property name="addresses">
+                            <list>
+                                <!-- In distributed environment, replace with actual host IP address. -->
+                                <value>127.0.0.1:47500..47502</value>
+                            </list>
+                        </property>
+                    </bean>
+                </property>
+            </bean>
+        </property>
+    </bean>
+</beans>
diff --git a/examples/config/encryption/example_keystore.jks b/examples/config/encryption/example_keystore.jks
new file mode 100644
index 000000000000..9d4476766822
Binary files /dev/null and b/examples/config/encryption/example_keystore.jks differ
diff --git a/examples/pom-standalone-lgpl.xml b/examples/pom-standalone-lgpl.xml
index 09698de49f5e..29cac8bcf746 100644
--- a/examples/pom-standalone-lgpl.xml
+++ b/examples/pom-standalone-lgpl.xml
@@ -74,7 +74,7 @@
 
         <dependency>
             <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-spring-data</artifactId>
+            <artifactId>ignite-spring-data_2.0</artifactId>
             <version>to_be_replaced_by_ignite_version</version>
         </dependency>
 
diff --git a/examples/pom-standalone.xml b/examples/pom-standalone.xml
index 385c2cf461cc..3ccccbf96b94 100644
--- a/examples/pom-standalone.xml
+++ b/examples/pom-standalone.xml
@@ -74,7 +74,7 @@
 
         <dependency>
             <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-spring-data</artifactId>
+            <artifactId>ignite-spring-data_2.0</artifactId>
             <version>to_be_replaced_by_ignite_version</version>
         </dependency>
 
diff --git a/examples/pom.xml b/examples/pom.xml
index e745beb7204d..c6b0a5f59db0 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -145,7 +145,7 @@
                 <dependency>
                     <groupId>org.scalatest</groupId>
                     <artifactId>scalatest_2.11</artifactId>
-                    <version>2.2.4</version>
+                    <version>${scala.test.version}</version>
                     <scope>test</scope>
                     <exclusions>
                         <exclusion>
diff --git a/examples/sql/world.sql b/examples/sql/world.sql
index a34ee71fbf5d..829fba12abea 100644
--- a/examples/sql/world.sql
+++ b/examples/sql/world.sql
@@ -2,30 +2,30 @@ DROP TABLE IF EXISTS Country;
 
 CREATE TABLE Country (
   Code CHAR(3) PRIMARY KEY,
-  Name CHAR(52),
-  Continent CHAR(50),
-  Region CHAR(26),
+  Name VARCHAR,
+  Continent VARCHAR,
+  Region VARCHAR,
   SurfaceArea DECIMAL(10,2),
-  IndepYear SMALLINT(6),
-  Population INT(11),
+  IndepYear SMALLINT,
+  Population INT,
   LifeExpectancy DECIMAL(3,1),
   GNP DECIMAL(10,2),
   GNPOld DECIMAL(10,2),
-  LocalName CHAR(45),
-  GovernmentForm CHAR(45),
-  HeadOfState CHAR(60),
-  Capital INT(11),
+  LocalName VARCHAR,
+  GovernmentForm VARCHAR,
+  HeadOfState VARCHAR,
+  Capital INT,
   Code2 CHAR(2)
 ) WITH "template=partitioned, backups=1, CACHE_NAME=Country, VALUE_TYPE=demo.model.Country";
 
 DROP TABLE IF EXISTS City;
 
 CREATE TABLE City (
-  ID INT(11),
-  Name CHAR(35),
+  ID INT,
+  Name VARCHAR,
   CountryCode CHAR(3),
-  District CHAR(20),
-  Population INT(11),
+  District VARCHAR,
+  Population INT,
   PRIMARY KEY (ID, CountryCode)
 ) WITH "template=partitioned, backups=1, affinityKey=CountryCode, CACHE_NAME=City, KEY_TYPE=demo.model.CityKey, VALUE_TYPE=demo.model.City";
 
@@ -35,7 +35,7 @@ DROP TABLE IF EXISTS CountryLanguage;
 
 CREATE TABLE CountryLanguage (
   CountryCode CHAR(3),
-  Language CHAR(30),
+  Language VARCHAR,
   IsOfficial CHAR(2),
   Percentage DECIMAL(4,1),
   PRIMARY KEY (CountryCode, Language)
diff --git a/examples/src/main/java/org/apache/ignite/examples/encryption/EncryptedCacheExample.java b/examples/src/main/java/org/apache/ignite/examples/encryption/EncryptedCacheExample.java
new file mode 100644
index 000000000000..137d19471c55
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/encryption/EncryptedCacheExample.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.encryption;
+
+import javax.cache.Cache;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ * This example demonstrates the usage of Apache Ignite Persistent Store.
+ * Data stored in persistence will be encrypted.
+ */
+public class EncryptedCacheExample {
+    /** */
+    public static void main(String[] args) {
+        System.out.println(">>> Starting cluster.");
+
+        // Starting Ignite with EncryptionSpi configured.
+        // Please, note, you should have the same keystore on every server node in cluster with enabled encryption.
+        // You can use encryption feature only for deployment with Ignite persistence enabled.
+        try (Ignite ignite = Ignition.start("examples/config/encryption/example-encrypted-store.xml")) {
+            // Activate the cluster. Required to do if the persistent store is enabled because you might need
+            // to wait while all the nodes, that store a subset of data on disk, join the cluster.
+            ignite.cluster().active(true);
+
+            CacheConfiguration<Long, BankAccount> ccfg = new CacheConfiguration<>("encrypted-cache");
+
+            // Enabling encryption for newly created cache.
+            ccfg.setEncryptionEnabled(true);
+
+            System.out.println(">>> Creating encrypted cache.");
+
+            IgniteCache<Long, BankAccount> cache = ignite.createCache(ccfg);
+
+            System.out.println(">>> Populating cache with data.");
+
+            // Data in this cache will be encrypted on the disk.
+            cache.put(1L, new BankAccount("Rich account", 1_000_000L));
+            cache.put(2L, new BankAccount("Middle account", 1_000L));
+            cache.put(3L, new BankAccount("One dollar account", 1L));
+        }
+
+        // After cluster shutdown data persisted on the disk in encrypted form.
+
+        System.out.println(">>> Starting cluster again.");
+        // Starting cluster again.
+        try (Ignite ignite = Ignition.start("examples/config/encryption/example-encrypted-store.xml")) {
+            ignite.cluster().active(true);
+
+            // We can obtain existing cache and load data from disk.
+            IgniteCache<Long, BankAccount> cache = ignite.getOrCreateCache("encrypted-cache");
+
+            QueryCursor<Cache.Entry<Long, BankAccount>> cursor = cache.query(new ScanQuery<>());
+
+            System.out.println(">>> Saved data:");
+
+            // Iterating through existing data.
+            for (Cache.Entry<Long, BankAccount> entry : cursor) {
+                System.out.println(">>> ID = " + entry.getKey() +
+                    ", AccountName = " + entry.getValue().accountName +
+                    ", Balance = " + entry.getValue().balance);
+            }
+
+        }
+    }
+
+    /**
+     * Test class with very secret data.
+     */
+    private static class BankAccount {
+        /**
+         * Name.
+         */
+        private String accountName;
+
+        /**
+         * Balance.
+         */
+        private long balance;
+
+        /** */
+        BankAccount(String accountName, long balance) {
+            this.accountName = accountName;
+            this.balance = balance;
+        }
+    }
+}
diff --git a/examples/src/test/java-lgpl/org/apache/ignite/examples/HibernateL2CacheExampleSelfTest.java b/examples/src/test/java-lgpl/org/apache/ignite/examples/HibernateL2CacheExampleSelfTest.java
index 68767d77c419..93e24b0694c3 100644
--- a/examples/src/test/java-lgpl/org/apache/ignite/examples/HibernateL2CacheExampleSelfTest.java
+++ b/examples/src/test/java-lgpl/org/apache/ignite/examples/HibernateL2CacheExampleSelfTest.java
@@ -19,15 +19,15 @@
 
 import org.apache.ignite.examples.datagrid.hibernate.HibernateL2CacheExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * Tests the {@link HibernateL2CacheExample}.
  */
 public class HibernateL2CacheExampleSelfTest extends GridAbstractExamplesTest {
-    /**
-     * @throws Exception If failed.
-     */
-    public void testHibernateL2CacheExample() throws Exception {
+    /** */
+    @Test
+    public void testHibernateL2CacheExample() {
         HibernateL2CacheExample.main(EMPTY_ARGS);
     }
 }
diff --git a/examples/src/test/java-lgpl/org/apache/ignite/examples/SpatialQueryExampleSelfTest.java b/examples/src/test/java-lgpl/org/apache/ignite/examples/SpatialQueryExampleSelfTest.java
index ac59d8e567b4..ea88cff99cbe 100644
--- a/examples/src/test/java-lgpl/org/apache/ignite/examples/SpatialQueryExampleSelfTest.java
+++ b/examples/src/test/java-lgpl/org/apache/ignite/examples/SpatialQueryExampleSelfTest.java
@@ -19,6 +19,7 @@
 
 import org.apache.ignite.examples.datagrid.SpatialQueryExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * Tests {@link SpatialQueryExample}.
@@ -27,6 +28,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSpatialQueryExample() throws Exception {
         SpatialQueryExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java-lgpl/org/apache/ignite/testsuites/IgniteLgplExamplesSelfTestSuite.java b/examples/src/test/java-lgpl/org/apache/ignite/testsuites/IgniteLgplExamplesSelfTestSuite.java
index 3c9101a31594..a5e714abecad 100644
--- a/examples/src/test/java-lgpl/org/apache/ignite/testsuites/IgniteLgplExamplesSelfTestSuite.java
+++ b/examples/src/test/java-lgpl/org/apache/ignite/testsuites/IgniteLgplExamplesSelfTestSuite.java
@@ -17,36 +17,39 @@
 
 package org.apache.ignite.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.examples.HibernateL2CacheExampleMultiNodeSelfTest;
 import org.apache.ignite.examples.HibernateL2CacheExampleSelfTest;
 import org.apache.ignite.examples.SpatialQueryExampleMultiNodeSelfTest;
 import org.apache.ignite.examples.SpatialQueryExampleSelfTest;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_OVERRIDE_MCAST_GRP;
 
 /**
  * Examples test suite. <p> Contains only Spring ignite examples tests.
  */
-public class IgniteLgplExamplesSelfTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteLgplExamplesSelfTestSuite {
     /**
      * @return Suite.
-     * @throws Exception If failed.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         System.setProperty(IGNITE_OVERRIDE_MCAST_GRP,
             GridTestUtils.getNextMulticastGroup(IgniteLgplExamplesSelfTestSuite.class));
 
         TestSuite suite = new TestSuite("Ignite Examples Test Suite");
 
-        suite.addTest(new TestSuite(HibernateL2CacheExampleSelfTest.class));
-        suite.addTest(new TestSuite(SpatialQueryExampleSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(HibernateL2CacheExampleSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(SpatialQueryExampleSelfTest.class));
 
         // Multi-node.
-        suite.addTest(new TestSuite(HibernateL2CacheExampleMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(SpatialQueryExampleMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(HibernateL2CacheExampleMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(SpatialQueryExampleMultiNodeSelfTest.class));
 
         return suite;
     }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/BasicExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/BasicExamplesSelfTest.java
index 41ae90a63444..fa1e63023077 100644
--- a/examples/src/test/java/org/apache/ignite/examples/BasicExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/BasicExamplesSelfTest.java
@@ -23,6 +23,7 @@
 import org.apache.ignite.examples.computegrid.ComputeRunnableExample;
 import org.apache.ignite.examples.datastructures.IgniteExecutorServiceExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * Closure examples self test.
@@ -31,6 +32,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBroadcastExample() throws Exception {
         ComputeBroadcastExample.main(EMPTY_ARGS);
     }
@@ -38,6 +40,7 @@ public void testBroadcastExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCallableExample() throws Exception {
         ComputeCallableExample.main(EMPTY_ARGS);
     }
@@ -45,6 +48,7 @@ public void testCallableExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClosureExample() throws Exception {
         ComputeClosureExample.main(EMPTY_ARGS);
     }
@@ -52,6 +56,7 @@ public void testClosureExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecutorExample() throws Exception {
         IgniteExecutorServiceExample.main(EMPTY_ARGS);
     }
@@ -67,6 +72,7 @@ public void testExecutorExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRunnableExample() throws Exception {
         ComputeRunnableExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/CacheClientBinaryExampleTest.java b/examples/src/test/java/org/apache/ignite/examples/CacheClientBinaryExampleTest.java
index 01be0bc7e055..db25c603fd4f 100644
--- a/examples/src/test/java/org/apache/ignite/examples/CacheClientBinaryExampleTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/CacheClientBinaryExampleTest.java
@@ -20,6 +20,7 @@
 import org.apache.ignite.examples.binary.datagrid.CacheClientBinaryPutGetExample;
 import org.apache.ignite.examples.binary.datagrid.CacheClientBinaryQueryExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  *
@@ -33,6 +34,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBinaryPutGetExample() throws Exception {
         CacheClientBinaryPutGetExample.main(new String[] {});
     }
@@ -40,6 +42,7 @@ public void testBinaryPutGetExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBinaryQueryExample() throws Exception {
         CacheClientBinaryQueryExample.main(new String[] {});
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/CacheContinuousQueryExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/CacheContinuousQueryExamplesSelfTest.java
index 1a1ae4e8e8e9..d3aa704edcd2 100644
--- a/examples/src/test/java/org/apache/ignite/examples/CacheContinuousQueryExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/CacheContinuousQueryExamplesSelfTest.java
@@ -21,6 +21,7 @@
 import org.apache.ignite.examples.datagrid.CacheContinuousQueryExample;
 import org.apache.ignite.examples.datagrid.CacheContinuousQueryWithTransformerExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  */
@@ -28,6 +29,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheContinuousAsyncQueryExample() throws Exception {
         CacheContinuousAsyncQueryExample.main(new String[] {});
     }
@@ -35,6 +37,7 @@ public void testCacheContinuousAsyncQueryExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheContinuousQueryExample() throws Exception {
         CacheContinuousQueryExample.main(new String[] {});
     }
@@ -42,6 +45,7 @@ public void testCacheContinuousQueryExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheContinuousQueryWithTransformerExample() throws Exception {
         CacheContinuousQueryWithTransformerExample.main(new String[] {});
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/CacheExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/CacheExamplesSelfTest.java
index 0085573133ce..258adbc5139e 100644
--- a/examples/src/test/java/org/apache/ignite/examples/CacheExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/CacheExamplesSelfTest.java
@@ -21,6 +21,7 @@
 import org.apache.ignite.examples.datagrid.CacheEntryProcessorExample;
 import org.apache.ignite.examples.datagrid.CacheApiExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 //import org.apache.ignite.examples.datagrid.starschema.*;
 //import org.apache.ignite.examples.datagrid.store.dummy.*;
@@ -33,6 +34,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheAffinityExample() throws Exception {
         CacheAffinityExample.main(EMPTY_ARGS);
     }
@@ -40,6 +42,7 @@ public void testCacheAffinityExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheEntryProcessorExample() throws Exception {
         CacheEntryProcessorExample.main(EMPTY_ARGS);
     }
@@ -112,6 +115,7 @@ public void testCacheEntryProcessorExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheApiExample() throws Exception {
         CacheApiExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/CheckpointExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/CheckpointExamplesSelfTest.java
index 03185c8a14f6..5327bed40e78 100644
--- a/examples/src/test/java/org/apache/ignite/examples/CheckpointExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/CheckpointExamplesSelfTest.java
@@ -18,10 +18,12 @@
 package org.apache.ignite.examples;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * Checkpoint examples self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class CheckpointExamplesSelfTest extends GridAbstractExamplesTest {
     /**
      * TODO: IGNITE-711 next example(s) should be implemented for java 8
diff --git a/examples/src/test/java/org/apache/ignite/examples/ClusterGroupExampleSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/ClusterGroupExampleSelfTest.java
index 35b251012018..d6c5d4965052 100644
--- a/examples/src/test/java/org/apache/ignite/examples/ClusterGroupExampleSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/ClusterGroupExampleSelfTest.java
@@ -18,10 +18,12 @@
 package org.apache.ignite.examples;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  *
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class ClusterGroupExampleSelfTest extends GridAbstractExamplesTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
diff --git a/examples/src/test/java/org/apache/ignite/examples/ComputeClientBinaryExampleTest.java b/examples/src/test/java/org/apache/ignite/examples/ComputeClientBinaryExampleTest.java
index 5dcad62d2ddb..30480f0ea3a3 100644
--- a/examples/src/test/java/org/apache/ignite/examples/ComputeClientBinaryExampleTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/ComputeClientBinaryExampleTest.java
@@ -18,6 +18,7 @@
 
 import org.apache.ignite.examples.binary.computegrid.ComputeClientBinaryTaskExecutionExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  *
@@ -31,6 +32,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBinaryTaskExecutionExample() throws Exception {
         ComputeClientBinaryTaskExecutionExample.main(new String[] {});
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesMultiNodeSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesMultiNodeSelfTest.java
index f73a74d3aa39..01aa4c973a2b 100644
--- a/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesMultiNodeSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesMultiNodeSelfTest.java
@@ -17,12 +17,15 @@
 
 package org.apache.ignite.examples;
 
+import org.junit.Ignore;
+
 /**
  * Continuation example multi-node self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class ContinuationExamplesMultiNodeSelfTest extends ContinuationExamplesSelfTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
         startRemoteNodes();
     }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesSelfTest.java
index 512a55b794df..5ee93f6ea405 100644
--- a/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/ContinuationExamplesSelfTest.java
@@ -20,10 +20,12 @@
 //import org.apache.ignite.examples.computegrid.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * Continuation example self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class ContinuationExamplesSelfTest extends GridAbstractExamplesTest {
     /**
      * TODO: IGNITE-711 next example(s) should be implemented for java 8
diff --git a/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesMultiNodeSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesMultiNodeSelfTest.java
index e85e28186b79..2495e6d15d74 100644
--- a/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesMultiNodeSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesMultiNodeSelfTest.java
@@ -17,12 +17,15 @@
 
 package org.apache.ignite.examples;
 
+import org.junit.Ignore;
+
 /**
  * ContinuousMapperExample multi-node self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class ContinuousMapperExamplesMultiNodeSelfTest extends ContinuationExamplesSelfTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
         startRemoteNodes();
     }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesSelfTest.java
index 0ae7dc1c420a..0029a5cb5d84 100644
--- a/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/ContinuousMapperExamplesSelfTest.java
@@ -18,10 +18,12 @@
 package org.apache.ignite.examples;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * ContinuousMapperExample self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class ContinuousMapperExamplesSelfTest extends GridAbstractExamplesTest {
     /**
      * TODO: IGNITE-711 next example(s) should be implemented for java 8
diff --git a/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesMultiNodeSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesMultiNodeSelfTest.java
index c57f2851bd68..2edf75eb53ef 100644
--- a/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesMultiNodeSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesMultiNodeSelfTest.java
@@ -17,11 +17,14 @@
 
 package org.apache.ignite.examples;
 
+import org.junit.Ignore;
+
 /**
  * Deployment examples multi-node self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class DeploymentExamplesMultiNodeSelfTest extends DeploymentExamplesSelfTest {
-    // TODO: IGNITE-711 next example(s) should be implemented for java 8 
+    // TODO: IGNITE-711 next example(s) should be implemented for java 8
     // or testing method(s) should be removed if example(s) does not applicable for java 8.
     /** {@inheritDoc} */
 //    @Override public void testDeploymentExample() throws Exception {
@@ -29,4 +32,4 @@
 //
 //        super.testDeploymentExample();
 //    }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesSelfTest.java
index 8a01b9b82360..2711d25cea92 100644
--- a/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/DeploymentExamplesSelfTest.java
@@ -20,10 +20,12 @@
 //import org.apache.ignite.examples.misc.deployment.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * Deployment examples self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class DeploymentExamplesSelfTest extends GridAbstractExamplesTest {
     // TODO: IGNITE-711 next example(s) should be implemented for java 8
     // or testing method(s) should be removed if example(s) does not applicable for java 8.
diff --git a/examples/src/test/java/org/apache/ignite/examples/EncryptedCacheExampleSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/EncryptedCacheExampleSelfTest.java
new file mode 100644
index 000000000000..66cd4cf341ac
--- /dev/null
+++ b/examples/src/test/java/org/apache/ignite/examples/EncryptedCacheExampleSelfTest.java
@@ -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.
+ */
+
+package org.apache.ignite.examples;
+
+import org.apache.ignite.examples.encryption.EncryptedCacheExample;
+import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
+
+/**
+ */
+public class EncryptedCacheExampleSelfTest extends GridAbstractExamplesTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        cleanPersistenceDir();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testBinaryPutGetExample() throws Exception {
+        EncryptedCacheExample.main(new String[] {});
+    }
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/EventsExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/EventsExamplesSelfTest.java
index 8e675a3c0be7..635b247ad76f 100644
--- a/examples/src/test/java/org/apache/ignite/examples/EventsExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/EventsExamplesSelfTest.java
@@ -19,6 +19,7 @@
 
 import org.apache.ignite.examples.events.EventsExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * Events examples self test.
@@ -27,6 +28,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testEventsExample() throws Exception {
         EventsExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/IgfsExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/IgfsExamplesSelfTest.java
index 1be686ca8688..d227acb79bb0 100644
--- a/examples/src/test/java/org/apache/ignite/examples/IgfsExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/IgfsExamplesSelfTest.java
@@ -21,10 +21,12 @@
 //import org.apache.ignite.internal.util.typedef.internal.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * IGFS examples self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class IgfsExamplesSelfTest extends GridAbstractExamplesTest {
     /** IGFS config with shared memory IPC. */
     private static final String IGFS_SHMEM_CFG = "modules/core/src/test/config/igfs-shmem.xml";
diff --git a/examples/src/test/java/org/apache/ignite/examples/LifecycleExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/LifecycleExamplesSelfTest.java
index b89a8f7fbc48..2b80865943d5 100644
--- a/examples/src/test/java/org/apache/ignite/examples/LifecycleExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/LifecycleExamplesSelfTest.java
@@ -20,10 +20,12 @@
 //import org.apache.ignite.examples.misc.lifecycle.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * LifecycleExample self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class LifecycleExamplesSelfTest extends GridAbstractExamplesTest {
     /**
      * TODO: IGNITE-711 next example(s) should be implemented for java 8
diff --git a/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesMultiNodeSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesMultiNodeSelfTest.java
index fd57fbb0171a..3972084e9786 100644
--- a/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesMultiNodeSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesMultiNodeSelfTest.java
@@ -19,15 +19,18 @@
 
 //import org.apache.ignite.examples.misc.client.memcache.*;
 
+import org.junit.Ignore;
+
 /**
  * MemcacheRestExample multi-node self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class MemcacheRestExamplesMultiNodeSelfTest extends MemcacheRestExamplesSelfTest {
-    // TODO: IGNITE-711 next example(s) should be implemented for java 8 
+    // TODO: IGNITE-711 next example(s) should be implemented for java 8
     // or testing method(s) should be removed if example(s) does not applicable for java 8.
     /** {@inheritDoc} */
 //    @Override protected void beforeTest() throws Exception {
 //        for (int i = 0; i < RMT_NODES_CNT; i++)
 //            startGrid("memcache-rest-examples-" + i, MemcacheRestExampleNodeStartup.configuration());
 //    }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesSelfTest.java
index 762343d31f26..f2b7b6e5019d 100644
--- a/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/MemcacheRestExamplesSelfTest.java
@@ -20,10 +20,12 @@
 //import org.apache.ignite.examples.misc.client.memcache.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * MemcacheRestExample self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class MemcacheRestExamplesSelfTest extends GridAbstractExamplesTest {
 //    TODO: IGNITE-711 next example(s) should be implemented for java 8
 //    or testing method(s) should be removed if example(s) does not applicable for java 8.
diff --git a/examples/src/test/java/org/apache/ignite/examples/MessagingExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/MessagingExamplesSelfTest.java
index 3c94d3b20a6c..0686dffc9c54 100644
--- a/examples/src/test/java/org/apache/ignite/examples/MessagingExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/MessagingExamplesSelfTest.java
@@ -20,6 +20,7 @@
 import org.apache.ignite.examples.messaging.MessagingExample;
 import org.apache.ignite.examples.messaging.MessagingPingPongExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * Messaging examples self test.
@@ -33,6 +34,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMessagingExample() throws Exception {
         MessagingExample.main(EMPTY_ARGS);
     }
@@ -40,6 +42,7 @@ public void testMessagingExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMessagingPingPongExample() throws Exception {
         MessagingPingPongExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesMultiNodeSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesMultiNodeSelfTest.java
index f641a45aaa2c..135f8649f399 100644
--- a/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesMultiNodeSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesMultiNodeSelfTest.java
@@ -17,12 +17,15 @@
 
 package org.apache.ignite.examples;
 
+import org.junit.Ignore;
+
 /**
  * PrimeExample multi-node self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class MonteCarloExamplesMultiNodeSelfTest extends MonteCarloExamplesSelfTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
         startRemoteNodes();
     }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesSelfTest.java
index beba341d5d2a..66026b2f55b2 100644
--- a/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/MonteCarloExamplesSelfTest.java
@@ -20,6 +20,7 @@
 //import org.apache.ignite.examples.computegrid.montecarlo.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * Ignite examples self test. Excludes Ignite Spring tests.
@@ -65,6 +66,7 @@
  *      Classpath should contain the {@code ${IGNITE_HOME}/modules/tests/config/aop/aspectj} folder.
  * </li>
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class MonteCarloExamplesSelfTest extends GridAbstractExamplesTest {
     /**
      * TODO: IGNITE-711 next example(s) should be implemented for java 8
diff --git a/examples/src/test/java/org/apache/ignite/examples/SpringBeanExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/SpringBeanExamplesSelfTest.java
index 4cc209f0e9cd..c9c69dc52a48 100644
--- a/examples/src/test/java/org/apache/ignite/examples/SpringBeanExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/SpringBeanExamplesSelfTest.java
@@ -20,10 +20,12 @@
 //import org.apache.ignite.examples.misc.springbean.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * Spring bean examples self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class SpringBeanExamplesSelfTest extends GridAbstractExamplesTest {
     /**
      * TODO: IGNITE-711 next example(s) should be implemented for java 8
diff --git a/examples/src/test/java/org/apache/ignite/examples/SpringDataExampleSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/SpringDataExampleSelfTest.java
index 516ad4546347..bba21b3d6680 100644
--- a/examples/src/test/java/org/apache/ignite/examples/SpringDataExampleSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/SpringDataExampleSelfTest.java
@@ -18,6 +18,7 @@
 
 import org.apache.ignite.examples.springdata.SpringDataExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * Spring Data example test.
@@ -26,6 +27,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSpringDataExample() throws Exception {
         SpringDataExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/SqlExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/SqlExamplesSelfTest.java
index 0bf01d8a534d..c105335b9e73 100644
--- a/examples/src/test/java/org/apache/ignite/examples/SqlExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/SqlExamplesSelfTest.java
@@ -21,6 +21,7 @@
 import org.apache.ignite.examples.sql.SqlDmlExample;
 import org.apache.ignite.examples.sql.SqlQueriesExample;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Test;
 
 /**
  * SQL examples self test.
@@ -29,6 +30,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlJavaExample() throws Exception {
         SqlQueriesExample.main(EMPTY_ARGS);
     }
@@ -36,6 +38,7 @@ public void testSqlJavaExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlDmlExample() throws Exception {
         SqlDmlExample.main(EMPTY_ARGS);
     }
@@ -43,6 +46,7 @@ public void testSqlDmlExample() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlDdlExample() throws Exception {
         SqlDdlExample.main(EMPTY_ARGS);
     }
diff --git a/examples/src/test/java/org/apache/ignite/examples/TaskExamplesMultiNodeSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/TaskExamplesMultiNodeSelfTest.java
index 06c4dd831fb8..676123425e5c 100644
--- a/examples/src/test/java/org/apache/ignite/examples/TaskExamplesMultiNodeSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/TaskExamplesMultiNodeSelfTest.java
@@ -17,12 +17,15 @@
 
 package org.apache.ignite.examples;
 
+import org.junit.Ignore;
+
 /**
  * Hello world examples multi-node self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class TaskExamplesMultiNodeSelfTest extends TaskExamplesSelfTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
         startRemoteNodes();
     }
-}
\ No newline at end of file
+}
diff --git a/examples/src/test/java/org/apache/ignite/examples/TaskExamplesSelfTest.java b/examples/src/test/java/org/apache/ignite/examples/TaskExamplesSelfTest.java
index 72ad3c7f87e8..a9b7f95c0a33 100644
--- a/examples/src/test/java/org/apache/ignite/examples/TaskExamplesSelfTest.java
+++ b/examples/src/test/java/org/apache/ignite/examples/TaskExamplesSelfTest.java
@@ -20,10 +20,12 @@
 //import org.apache.ignite.examples.computegrid.*;
 
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.Ignore;
 
 /**
  * Hello world examples self test.
  */
+@Ignore("https://issues.apache.org/jira/browse/IGNITE-711")
 public class TaskExamplesSelfTest extends GridAbstractExamplesTest {
 //    TODO: IGNITE-711 next example(s) should be implemented for java 8
 //    or testing method(s) should be removed if example(s) does not applicable for java 8.
diff --git a/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesJ8SelfTestSuite.java b/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesJ8SelfTestSuite.java
index f73d97791684..f281ec57252b 100644
--- a/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesJ8SelfTestSuite.java
+++ b/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesJ8SelfTestSuite.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.examples.BasicExamplesMultiNodeSelfTest;
 import org.apache.ignite.examples.BasicExamplesSelfTest;
@@ -45,35 +46,35 @@ public static TestSuite suite() throws Exception {
 
         TestSuite suite = new TestSuite("Ignite Examples Test Suite");
 
-        suite.addTest(new TestSuite(CacheExamplesSelfTest.class));
-        suite.addTest(new TestSuite(BasicExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(CacheExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(BasicExamplesSelfTest.class));
 
-//        suite.addTest(new TestSuite(ContinuationExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(ContinuousMapperExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(DeploymentExamplesSelfTest.class));
-        suite.addTest(new TestSuite(EventsExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(LifecycleExamplesSelfTest.class));
-        suite.addTest(new TestSuite(MessagingExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(MemcacheRestExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(MonteCarloExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(TaskExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(SpringBeanExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(IgfsExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(CheckpointExamplesSelfTest.class));
-//        suite.addTest(new TestSuite(HibernateL2CacheExampleSelfTest.class));
-//        suite.addTest(new TestSuite(ClusterGroupExampleSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(ContinuationExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(ContinuousMapperExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(DeploymentExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(EventsExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(LifecycleExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MessagingExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(MemcacheRestExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(MonteCarloExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(TaskExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(SpringBeanExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(IgfsExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(CheckpointExamplesSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(HibernateL2CacheExampleSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(ClusterGroupExampleSelfTest.class));
 
         // Multi-node.
-        suite.addTest(new TestSuite(CacheExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(BasicExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(ContinuationExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(ContinuousMapperExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(DeploymentExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(EventsExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(TaskExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(MemcacheRestExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(MonteCarloExamplesMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(HibernateL2CacheExampleMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(CacheExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(BasicExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(ContinuationExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(ContinuousMapperExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(DeploymentExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(EventsExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(TaskExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(MemcacheRestExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(MonteCarloExamplesMultiNodeSelfTest.class));
+//        suite.addTest(new JUnit4TestAdapter(HibernateL2CacheExampleMultiNodeSelfTest.class));
 
         return suite;
     }
diff --git a/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesMLTestSuite.java b/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesMLTestSuite.java
index 6b41301ccef5..8551460dd76d 100644
--- a/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesMLTestSuite.java
+++ b/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesMLTestSuite.java
@@ -27,12 +27,21 @@
 import javassist.ClassClassPath;
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.CtMethod;
 import javassist.CtNewMethod;
 import javassist.NotFoundException;
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.ClassFile;
+import javassist.bytecode.ConstPool;
+import javassist.bytecode.annotation.Annotation;
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.examples.ml.util.MLExamplesCommonArgs;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridAbstractExamplesTest;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_OVERRIDE_MCAST_GRP;
 
@@ -41,13 +50,21 @@
  * <p>
  * Contains only ML Grid Ignite examples tests.</p>
  */
-public class IgniteExamplesMLTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteExamplesMLTestSuite {
     /** Base package to create test classes in. */
     private static final String basePkgForTests = "org.apache.ignite.examples.ml";
 
     /** Test class name pattern. */
     private static final String clsNamePtrn = ".*Example$";
 
+    /** */
+    @BeforeClass
+    public static void init() {
+        System.setProperty(IGNITE_OVERRIDE_MCAST_GRP,
+            GridTestUtils.getNextMulticastGroup(IgniteExamplesMLTestSuite.class));
+    }
+
     /**
      * Creates test suite for Ignite ML examples.
      *
@@ -55,13 +72,10 @@
      * @throws Exception If failed.
      */
     public static TestSuite suite() throws Exception {
-        System.setProperty(IGNITE_OVERRIDE_MCAST_GRP,
-            GridTestUtils.getNextMulticastGroup(IgniteExamplesMLTestSuite.class));
-
         TestSuite suite = new TestSuite("Ignite ML Examples Test Suite");
 
         for (Class clazz : getClasses(basePkgForTests))
-            suite.addTest(new TestSuite(makeTestClass(clazz)));
+            suite.addTest(new JUnit4TestAdapter(makeTestClass(clazz)));
 
         return suite;
     }
@@ -79,15 +93,25 @@ private static Class makeTestClass(Class<?> exampleCls)
         ClassPool cp = ClassPool.getDefault();
         cp.insertClassPath(new ClassClassPath(IgniteExamplesMLTestSuite.class));
 
-        CtClass cl = cp.makeClass(basePkgForTests + "." + exampleCls.getSimpleName() + "SelfName");
+        CtClass cl = cp.makeClass(basePkgForTests + "." + exampleCls.getSimpleName() + "SelfTest");
 
         cl.setSuperclass(cp.get(GridAbstractExamplesTest.class.getName()));
 
-        cl.addMethod(CtNewMethod.make("public void testExample() { "
+        CtMethod mtd = CtNewMethod.make("public void testExample() { "
             + exampleCls.getCanonicalName()
             + ".main("
             + MLExamplesCommonArgs.class.getName()
-            + ".EMPTY_ARGS_ML); }", cl));
+            + ".EMPTY_ARGS_ML); }", cl);
+
+        // Create and add annotation.
+        ClassFile ccFile = cl.getClassFile();
+        ConstPool constpool = ccFile.getConstPool();
+        AnnotationsAttribute attr = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
+        Annotation annot = new Annotation("org.junit.Test", constpool);
+        attr.addAnnotation(annot);
+        mtd.getMethodInfo().addAttribute(attr);
+
+        cl.addMethod(mtd);
 
         return cl.toClass();
     }
diff --git a/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesSelfTestSuite.java b/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesSelfTestSuite.java
index a55abdf7c912..31e9a6c48135 100644
--- a/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesSelfTestSuite.java
+++ b/examples/src/test/java/org/apache/ignite/testsuites/IgniteExamplesSelfTestSuite.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.examples.BasicExamplesMultiNodeSelfTest;
 import org.apache.ignite.examples.BasicExamplesSelfTest;
@@ -33,6 +34,7 @@
 import org.apache.ignite.examples.ContinuousMapperExamplesSelfTest;
 import org.apache.ignite.examples.DeploymentExamplesMultiNodeSelfTest;
 import org.apache.ignite.examples.DeploymentExamplesSelfTest;
+import org.apache.ignite.examples.EncryptedCacheExampleSelfTest;
 import org.apache.ignite.examples.EventsExamplesMultiNodeSelfTest;
 import org.apache.ignite.examples.EventsExamplesSelfTest;
 import org.apache.ignite.examples.IgfsExamplesSelfTest;
@@ -47,59 +49,64 @@
 import org.apache.ignite.examples.SqlExamplesSelfTest;
 import org.apache.ignite.examples.TaskExamplesMultiNodeSelfTest;
 import org.apache.ignite.examples.TaskExamplesSelfTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 /**
  * Examples test suite.
  * <p>
  * Contains all Ignite examples tests.</p>
  */
-public class IgniteExamplesSelfTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteExamplesSelfTestSuite {
     /**
      * @return Suite.
-     * @throws Exception If failed.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
 //        System.setProperty(IGNITE_OVERRIDE_MCAST_GRP,
 //            GridTestUtils.getNextMulticastGroup(IgniteExamplesSelfTestSuite.class));
 
         TestSuite suite = new TestSuite("Ignite Examples Test Suite");
 
-        suite.addTest(new TestSuite(CacheExamplesSelfTest.class));
-        suite.addTest(new TestSuite(SqlExamplesSelfTest.class));
-        suite.addTest(new TestSuite(BasicExamplesSelfTest.class));
-        suite.addTest(new TestSuite(ContinuationExamplesSelfTest.class));
-        suite.addTest(new TestSuite(ContinuousMapperExamplesSelfTest.class));
-        suite.addTest(new TestSuite(DeploymentExamplesSelfTest.class));
-        suite.addTest(new TestSuite(EventsExamplesSelfTest.class));
-        suite.addTest(new TestSuite(LifecycleExamplesSelfTest.class));
-        suite.addTest(new TestSuite(MessagingExamplesSelfTest.class));
-        suite.addTest(new TestSuite(MemcacheRestExamplesSelfTest.class));
-        suite.addTest(new TestSuite(MonteCarloExamplesSelfTest.class));
-        suite.addTest(new TestSuite(TaskExamplesSelfTest.class));
-        suite.addTest(new TestSuite(SpringBeanExamplesSelfTest.class));
-        suite.addTest(new TestSuite(SpringDataExampleSelfTest.class));
-        suite.addTest(new TestSuite(IgfsExamplesSelfTest.class));
-        suite.addTest(new TestSuite(CheckpointExamplesSelfTest.class));
-        suite.addTest(new TestSuite(ClusterGroupExampleSelfTest.class));
-        suite.addTest(new TestSuite(CacheContinuousQueryExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(CacheExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(SqlExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(BasicExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(ContinuationExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(ContinuousMapperExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(DeploymentExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(EventsExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(LifecycleExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MessagingExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MemcacheRestExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MonteCarloExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(TaskExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(SpringBeanExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(SpringDataExampleSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(IgfsExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(CheckpointExamplesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(ClusterGroupExampleSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(CacheContinuousQueryExamplesSelfTest.class));
 
         // Multi-node.
-        suite.addTest(new TestSuite(CacheExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(BasicExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(ContinuationExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(ContinuousMapperExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(DeploymentExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(EventsExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(TaskExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(MemcacheRestExamplesMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(MonteCarloExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(CacheExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(BasicExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(ContinuationExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(ContinuousMapperExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(DeploymentExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(EventsExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(TaskExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MemcacheRestExamplesMultiNodeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MonteCarloExamplesMultiNodeSelfTest.class));
 
         // Binary.
-        suite.addTest(new TestSuite(CacheClientBinaryExampleTest.class));
-        suite.addTest(new TestSuite(ComputeClientBinaryExampleTest.class));
+        suite.addTest(new JUnit4TestAdapter(CacheClientBinaryExampleTest.class));
+        suite.addTest(new JUnit4TestAdapter(ComputeClientBinaryExampleTest.class));
 
         // ML Grid.
-        suite.addTest(IgniteExamplesMLTestSuite.suite());
+        suite.addTest(new JUnit4TestAdapter(IgniteExamplesMLTestSuite.class));
+
+        // Encryption.
+        suite.addTest(new JUnit4TestAdapter(EncryptedCacheExampleSelfTest.class));
 
         return suite;
     }
diff --git a/examples/src/test/spark/org/apache/ignite/spark/testsuites/IgniteExamplesSparkSelfTestSuite.java b/examples/src/test/spark/org/apache/ignite/spark/testsuites/IgniteExamplesSparkSelfTestSuite.java
index 6328ee241a19..43a1198ce569 100644
--- a/examples/src/test/spark/org/apache/ignite/spark/testsuites/IgniteExamplesSparkSelfTestSuite.java
+++ b/examples/src/test/spark/org/apache/ignite/spark/testsuites/IgniteExamplesSparkSelfTestSuite.java
@@ -17,11 +17,14 @@
 
 package org.apache.ignite.spark.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.spark.examples.IgniteDataFrameSelfTest;
 import org.apache.ignite.spark.examples.JavaIgniteDataFrameSelfTest;
 import org.apache.ignite.spark.examples.SharedRDDExampleSelfTest;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_OVERRIDE_MCAST_GRP;
 
@@ -30,20 +33,20 @@
  * <p>
  * Contains only Spring ignite examples tests.
  */
-public class IgniteExamplesSparkSelfTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteExamplesSparkSelfTestSuite {
     /**
      * @return Suite.
-     * @throws Exception If failed.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         System.setProperty(IGNITE_OVERRIDE_MCAST_GRP,
             GridTestUtils.getNextMulticastGroup(IgniteExamplesSparkSelfTestSuite.class));
 
         TestSuite suite = new TestSuite("Ignite Spark Examples Test Suite");
 
-        suite.addTest(new TestSuite(SharedRDDExampleSelfTest.class));
-        suite.addTest(new TestSuite(IgniteDataFrameSelfTest.class));
-        suite.addTest(new TestSuite(JavaIgniteDataFrameSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(SharedRDDExampleSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(IgniteDataFrameSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JavaIgniteDataFrameSelfTest.class));
 
         return suite;
     }
diff --git a/modules/aop/src/test/java/org/apache/ignite/gridify/AbstractAopTest.java b/modules/aop/src/test/java/org/apache/ignite/gridify/AbstractAopTest.java
index 33f2cddbfadd..f5f061fbdbb2 100644
--- a/modules/aop/src/test/java/org/apache/ignite/gridify/AbstractAopTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/gridify/AbstractAopTest.java
@@ -33,6 +33,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestClassLoader;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.events.EventType.EVT_CLASS_DEPLOYED;
 import static org.apache.ignite.events.EventType.EVT_TASK_DEPLOYED;
@@ -40,7 +43,8 @@
 /**
  * Abstract AOP test.
  */
-@SuppressWarnings( {"OverlyStrongTypeCast", "JUnitAbstractTestClassNamingConvention", "ProhibitedExceptionDeclared", "IfMayBeConditional"})
+@SuppressWarnings( {"OverlyStrongTypeCast", "ProhibitedExceptionDeclared", "IfMayBeConditional"})
+@RunWith(JUnit4.class)
 public abstract class AbstractAopTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -65,6 +69,7 @@
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultPrivate() throws Exception {
         checkDefault(DeploymentMode.PRIVATE);
     }
@@ -72,6 +77,7 @@ public void testDefaultPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultIsolated() throws Exception {
         checkDefault(DeploymentMode.ISOLATED);
     }
@@ -79,6 +85,7 @@ public void testDefaultIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultContinuous() throws Exception {
         checkDefault(DeploymentMode.CONTINUOUS);
     }
@@ -86,6 +93,7 @@ public void testDefaultContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultShared() throws Exception {
         checkDefault(DeploymentMode.SHARED);
     }
@@ -93,6 +101,7 @@ public void testDefaultShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultWithUserClassLoaderPrivate() throws Exception {
         checkDefaultWithUserClassLoader(DeploymentMode.PRIVATE);
     }
@@ -100,6 +109,7 @@ public void testDefaultWithUserClassLoaderPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultWithUserClassLoaderIsolated() throws Exception {
         checkDefaultWithUserClassLoader(DeploymentMode.ISOLATED);
     }
@@ -107,6 +117,7 @@ public void testDefaultWithUserClassLoaderIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultWithUserClassLoaderContinuous() throws Exception {
         checkDefaultWithUserClassLoader(DeploymentMode.CONTINUOUS);
     }
@@ -114,6 +125,7 @@ public void testDefaultWithUserClassLoaderContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultWithUserClassLoaderShared() throws Exception {
         checkDefaultWithUserClassLoader(DeploymentMode.SHARED);
     }
@@ -121,6 +133,7 @@ public void testDefaultWithUserClassLoaderShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testSingleDeploymentWithUserClassLoaderPrivate() throws Exception {
         checkSingleDeploymentWithUserClassLoader(DeploymentMode.PRIVATE);
     }
@@ -128,6 +141,7 @@ public void testSingleDeploymentWithUserClassLoaderPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testSingleDeploymentWithUserClassLoaderIsolated() throws Exception {
         checkSingleDeploymentWithUserClassLoader(DeploymentMode.ISOLATED);
     }
@@ -135,6 +149,7 @@ public void testSingleDeploymentWithUserClassLoaderIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testSingleDeploymentWithUserClassLoaderContinuous() throws Exception {
         checkSingleDeploymentWithUserClassLoader(DeploymentMode.CONTINUOUS);
     }
@@ -142,6 +157,7 @@ public void testSingleDeploymentWithUserClassLoaderContinuous() throws Exception
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testSingleDeploymentWithUserClassLoaderShared() throws Exception {
         checkSingleDeploymentWithUserClassLoader(DeploymentMode.SHARED);
     }
@@ -149,6 +165,7 @@ public void testSingleDeploymentWithUserClassLoaderShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceWithUserClassLoaderPrivate() throws Exception {
         checkDefaultResourceWithUserClassLoader(DeploymentMode.PRIVATE);
     }
@@ -156,6 +173,7 @@ public void testDefaultResourceWithUserClassLoaderPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceWithUserClassLoaderIsolated() throws Exception {
         checkDefaultResourceWithUserClassLoader(DeploymentMode.ISOLATED);
     }
@@ -163,6 +181,7 @@ public void testDefaultResourceWithUserClassLoaderIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceWithUserClassLoaderContinuous() throws Exception {
         checkDefaultResourceWithUserClassLoader(DeploymentMode.CONTINUOUS);
     }
@@ -170,6 +189,7 @@ public void testDefaultResourceWithUserClassLoaderContinuous() throws Exception
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceWithUserClassLoaderShared() throws Exception {
         checkDefaultResourceWithUserClassLoader(DeploymentMode.SHARED);
     }
@@ -177,6 +197,7 @@ public void testDefaultResourceWithUserClassLoaderShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassPrivate() throws Exception {
         checkNonDefaultClass(DeploymentMode.PRIVATE);
     }
@@ -184,6 +205,7 @@ public void testNonDefaultClassPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassIsolated() throws Exception {
         checkNonDefaultClass(DeploymentMode.ISOLATED);
     }
@@ -191,6 +213,7 @@ public void testNonDefaultClassIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassContinuous() throws Exception {
         checkNonDefaultClass(DeploymentMode.CONTINUOUS);
     }
@@ -198,6 +221,7 @@ public void testNonDefaultClassContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassShared() throws Exception {
         checkNonDefaultClass(DeploymentMode.SHARED);
     }
@@ -205,6 +229,7 @@ public void testNonDefaultClassShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNamePrivate() throws Exception {
         checkNonDefaultName(DeploymentMode.PRIVATE);
     }
@@ -212,6 +237,7 @@ public void testNonDefaultNamePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameIsolated() throws Exception {
         checkNonDefaultName(DeploymentMode.ISOLATED);
     }
@@ -219,6 +245,7 @@ public void testNonDefaultNameIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameContinuous() throws Exception {
         checkNonDefaultName(DeploymentMode.CONTINUOUS);
     }
@@ -226,6 +253,7 @@ public void testNonDefaultNameContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameShared() throws Exception {
         checkNonDefaultName(DeploymentMode.SHARED);
     }
@@ -233,6 +261,7 @@ public void testNonDefaultNameShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionPrivate() throws Exception {
         checkDefaultException(DeploymentMode.PRIVATE);
     }
@@ -240,6 +269,7 @@ public void testDefaultExceptionPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionIsolated() throws Exception {
         checkDefaultException(DeploymentMode.ISOLATED);
     }
@@ -247,6 +277,7 @@ public void testDefaultExceptionIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionContinuous() throws Exception {
         checkDefaultException(DeploymentMode.CONTINUOUS);
     }
@@ -254,6 +285,7 @@ public void testDefaultExceptionContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionShared() throws Exception {
         checkDefaultException(DeploymentMode.SHARED);
     }
@@ -261,6 +293,7 @@ public void testDefaultExceptionShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourcePrivate() throws Exception {
         checkDefaultResource(DeploymentMode.PRIVATE);
     }
@@ -268,6 +301,7 @@ public void testDefaultResourcePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceIsolated() throws Exception {
         checkDefaultResource(DeploymentMode.ISOLATED);
     }
@@ -275,6 +309,7 @@ public void testDefaultResourceIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceContinuous() throws Exception {
         checkDefaultResource(DeploymentMode.CONTINUOUS);
     }
@@ -282,6 +317,7 @@ public void testDefaultResourceContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceShared() throws Exception {
         checkDefaultResource(DeploymentMode.SHARED);
     }
@@ -289,6 +325,7 @@ public void testDefaultResourceShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourcePrivate() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.PRIVATE);
     }
@@ -296,6 +333,7 @@ public void testNonDefaultClassResourcePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourceIsolated() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.ISOLATED);
     }
@@ -303,6 +341,7 @@ public void testNonDefaultClassResourceIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourceContinuous() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.CONTINUOUS);
     }
@@ -310,6 +349,7 @@ public void testNonDefaultClassResourceContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourceShared() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.SHARED);
     }
@@ -317,6 +357,7 @@ public void testNonDefaultClassResourceShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourcePrivate() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.PRIVATE);
     }
@@ -324,6 +365,7 @@ public void testNonDefaultNameResourcePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourceIsolated() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.ISOLATED);
     }
@@ -331,6 +373,7 @@ public void testNonDefaultNameResourceIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourceContinuous() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.CONTINUOUS);
     }
@@ -338,6 +381,7 @@ public void testNonDefaultNameResourceContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourceShared() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.SHARED);
     }
@@ -557,7 +601,6 @@ private void checkNonDefaultName(DeploymentMode depMode) throws Exception {
      * @param depMode Deployment mode to use.
      * @throws Exception If failed.
      */
-    @SuppressWarnings({"CatchGenericClass"})
     private void checkDefaultException(DeploymentMode depMode) throws Exception {
         this.depMode = depMode;
 
diff --git a/modules/aop/src/test/java/org/apache/ignite/gridify/BasicAopSelfTest.java b/modules/aop/src/test/java/org/apache/ignite/gridify/BasicAopSelfTest.java
index 54ac74fd2c4a..024a5364717f 100644
--- a/modules/aop/src/test/java/org/apache/ignite/gridify/BasicAopSelfTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/gridify/BasicAopSelfTest.java
@@ -26,6 +26,9 @@
 
 import java.util.Collection;
 import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tries to execute dummy gridified task. It should fail because grid is not started.
@@ -33,10 +36,12 @@
  * The main purpose of this test is to check that AOP is properly configured. It should
  * be included in all suites that require AOP.
  */
+@RunWith(JUnit4.class)
 public class BasicAopSelfTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAop() throws Exception {
         try {
             gridify();
@@ -71,4 +76,4 @@ private void gridify() {
             return null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXNonSpringAopSelfTest.java b/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXNonSpringAopSelfTest.java
index 2ebd272e6c60..14a7bff5585f 100644
--- a/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXNonSpringAopSelfTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXNonSpringAopSelfTest.java
@@ -25,6 +25,9 @@
 import java.util.List;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * To run this test with JBoss AOP make sure of the following:
@@ -51,10 +54,12 @@
  * 2. Classpath should contains the ${IGNITE_HOME}/modules/tests/config/aop/aspectj folder.
  */
 @GridCommonTest(group="AOP")
+@RunWith(JUnit4.class)
 public class GridifySetToXXXNonSpringAopSelfTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGridifySetToSet() throws Exception {
         try {
             startGrid("GridifySetToSetTarget");
@@ -111,6 +116,7 @@ public void testGridifySetToSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGridifySetToValue() throws Exception {
         try {
             startGrid("GridifySetToValueTarget");
@@ -206,4 +212,4 @@ public void testGridifySetToValue() throws Exception {
             return iter.next();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXSpringAopSelfTest.java b/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXSpringAopSelfTest.java
index 1dd499a031a1..7ff56d09a8b5 100644
--- a/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXSpringAopSelfTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/gridify/GridifySetToXXXSpringAopSelfTest.java
@@ -26,6 +26,9 @@
 import org.apache.ignite.compute.gridify.aop.spring.GridifySpringEnhancer;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * To run this test with JBoss AOP make sure of the following:
@@ -52,10 +55,12 @@
  * 2. Classpath should contains the ${IGNITE_HOME}/modules/tests/config/aop/aspectj folder.
  */
 @GridCommonTest(group="AOP")
+@RunWith(JUnit4.class)
 public class GridifySetToXXXSpringAopSelfTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGridifySetToSet() throws Exception {
         try {
             startGrid("GridifySetToSetTarget");
@@ -112,6 +117,7 @@ public void testGridifySetToSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGridifySetToValue() throws Exception {
         try {
             startGrid("GridifySetToValueTarget");
@@ -207,4 +213,4 @@ public void testGridifySetToValue() throws Exception {
             return iter.next();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/ignite/gridify/hierarchy/GridifyHierarchyTest.java b/modules/aop/src/test/java/org/apache/ignite/gridify/hierarchy/GridifyHierarchyTest.java
index 3dc8d53b8732..232d92892a72 100644
--- a/modules/aop/src/test/java/org/apache/ignite/gridify/hierarchy/GridifyHierarchyTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/gridify/hierarchy/GridifyHierarchyTest.java
@@ -18,10 +18,14 @@
 package org.apache.ignite.gridify.hierarchy;
 
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Gridify hierarchy test.
  */
+@RunWith(JUnit4.class)
 public class GridifyHierarchyTest extends GridCommonAbstractTest {
     /** */
     public GridifyHierarchyTest() {
@@ -38,6 +42,7 @@ public void noneTestGridifyHierarchyProtected() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGridifyHierarchyPrivate() throws Exception {
         Target target = new Target();
 
@@ -48,4 +53,4 @@ public void testGridifyHierarchyPrivate() throws Exception {
     @Override public String getTestIgniteInstanceName() {
         return "GridifyHierarchyTest";
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerAopTest.java b/modules/aop/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerAopTest.java
index 8236f435f9c1..672225f404af 100644
--- a/modules/aop/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerAopTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerAopTest.java
@@ -26,6 +26,9 @@
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.events.EventType.EVT_TASK_FINISHED;
 
@@ -44,6 +47,7 @@
  * </li>
  * </ul>
  */
+@RunWith(JUnit4.class)
 public class OptimizedMarshallerAopTest extends GridCommonAbstractTest {
     /** */
     private static final AtomicInteger cntr = new AtomicInteger();
@@ -71,6 +75,7 @@ public OptimizedMarshallerAopTest() {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testUp() throws Exception {
         G.ignite().events().localListen(new IgnitePredicate<Event>() {
             @Override public boolean apply(Event evt) {
@@ -95,4 +100,4 @@ public void testUp() throws Exception {
     private void gridify1() {
         X.println("Executes on grid");
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/ignite/p2p/P2PGridifySelfTest.java b/modules/aop/src/test/java/org/apache/ignite/p2p/P2PGridifySelfTest.java
index 7511d61b07fb..42e527c08f61 100644
--- a/modules/aop/src/test/java/org/apache/ignite/p2p/P2PGridifySelfTest.java
+++ b/modules/aop/src/test/java/org/apache/ignite/p2p/P2PGridifySelfTest.java
@@ -28,12 +28,16 @@
 import org.apache.ignite.testframework.GridTestClassLoader;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
 @SuppressWarnings({"ProhibitedExceptionDeclared"})
 @GridCommonTest(group = "P2P")
+@RunWith(JUnit4.class)
 public class P2PGridifySelfTest extends GridCommonAbstractTest {
     /** Current deployment mode. Used in {@link #getConfiguration(String)}. */
     private DeploymentMode depMode;
@@ -174,6 +178,7 @@ public Integer executeGridifyResource(int res) {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testPrivateMode() throws Exception {
         processTestBothNodesDeploy(DeploymentMode.PRIVATE);
     }
@@ -183,6 +188,7 @@ public void testPrivateMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testIsolatedMode() throws Exception {
         processTestBothNodesDeploy(DeploymentMode.ISOLATED);
     }
@@ -192,6 +198,7 @@ public void testIsolatedMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testContinuousMode() throws Exception {
         processTestBothNodesDeploy(DeploymentMode.CONTINUOUS);
     }
@@ -201,6 +208,7 @@ public void testContinuousMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testSharedMode() throws Exception {
         processTestBothNodesDeploy(DeploymentMode.SHARED);
     }
@@ -210,6 +218,7 @@ public void testSharedMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testResourcePrivateMode() throws Exception {
         processTestGridifyResource(DeploymentMode.PRIVATE);
     }
@@ -219,6 +228,7 @@ public void testResourcePrivateMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testResourceIsolatedMode() throws Exception {
         processTestGridifyResource(DeploymentMode.ISOLATED);
     }
@@ -228,6 +238,7 @@ public void testResourceIsolatedMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testResourceContinuousMode() throws Exception {
         processTestGridifyResource(DeploymentMode.CONTINUOUS);
     }
@@ -237,7 +248,8 @@ public void testResourceContinuousMode() throws Exception {
      *
      * @throws Exception if error occur.
      */
+    @Test
     public void testResourceSharedMode() throws Exception {
         processTestGridifyResource(DeploymentMode.SHARED);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/ignite/testsuites/IgniteAopSelfTestSuite.java b/modules/aop/src/test/java/org/apache/ignite/testsuites/IgniteAopSelfTestSuite.java
index b2dcea2f6163..399d759135de 100644
--- a/modules/aop/src/test/java/org/apache/ignite/testsuites/IgniteAopSelfTestSuite.java
+++ b/modules/aop/src/test/java/org/apache/ignite/testsuites/IgniteAopSelfTestSuite.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.gridify.BasicAopSelfTest;
 import org.apache.ignite.gridify.GridifySetToXXXNonSpringAopSelfTest;
@@ -24,6 +25,8 @@
 import org.apache.ignite.gridify.NonSpringAopSelfTest;
 import org.apache.ignite.gridify.SpringAopSelfTest;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 import org.test.gridify.ExternalNonSpringAopSelfTest;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_OVERRIDE_MCAST_GRP;
@@ -31,26 +34,26 @@
 /**
  * AOP test suite.
  */
-public class IgniteAopSelfTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteAopSelfTestSuite {
     /**
      * @return AOP test suite.
-     * @throws Exception If failed.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new TestSuite("Ignite AOP Test Suite");
 
         // Test configuration.
-        suite.addTestSuite(BasicAopSelfTest.class);
+        suite.addTest(new JUnit4TestAdapter(BasicAopSelfTest.class));
 
-        suite.addTestSuite(SpringAopSelfTest.class);
-        suite.addTestSuite(NonSpringAopSelfTest.class);
-        suite.addTestSuite(GridifySetToXXXSpringAopSelfTest.class);
-        suite.addTestSuite(GridifySetToXXXNonSpringAopSelfTest.class);
-        suite.addTestSuite(ExternalNonSpringAopSelfTest.class);
+        suite.addTest(new JUnit4TestAdapter(SpringAopSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(NonSpringAopSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(GridifySetToXXXSpringAopSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(GridifySetToXXXNonSpringAopSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(ExternalNonSpringAopSelfTest.class));
 
         // Examples
         System.setProperty(IGNITE_OVERRIDE_MCAST_GRP, GridTestUtils.getNextMulticastGroup(IgniteAopSelfTestSuite.class));
 
         return suite;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aop/src/test/java/org/apache/loadtests/direct/singlesplit/SingleSplitsLoadTest.java b/modules/aop/src/test/java/org/apache/loadtests/direct/singlesplit/SingleSplitsLoadTest.java
index 888a2f5f6353..48a57bc092b3 100644
--- a/modules/aop/src/test/java/org/apache/loadtests/direct/singlesplit/SingleSplitsLoadTest.java
+++ b/modules/aop/src/test/java/org/apache/loadtests/direct/singlesplit/SingleSplitsLoadTest.java
@@ -31,11 +31,15 @@
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
 import org.apache.log4j.Level;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Single split load test.
  */
 @GridCommonTest(group = "Load Test")
+@RunWith(JUnit4.class)
 public class SingleSplitsLoadTest extends GridCommonAbstractTest {
     /** */
     public SingleSplitsLoadTest() {
@@ -81,6 +85,7 @@ private int getThreadCount() {
      *
      * @throws Exception If task execution failed.
      */
+    @Test
     public void testLoad() throws Exception {
         final Ignite ignite = G.ignite(getTestIgniteInstanceName());
 
diff --git a/modules/aop/src/test/java/org/apache/loadtests/gridify/GridifySingleSplitLoadTest.java b/modules/aop/src/test/java/org/apache/loadtests/gridify/GridifySingleSplitLoadTest.java
index 9abeb6ed1767..f417c3c0157c 100644
--- a/modules/aop/src/test/java/org/apache/loadtests/gridify/GridifySingleSplitLoadTest.java
+++ b/modules/aop/src/test/java/org/apache/loadtests/gridify/GridifySingleSplitLoadTest.java
@@ -31,12 +31,15 @@
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
 import org.apache.log4j.Level;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Gridify single split load test.
  */
-@SuppressWarnings({"CatchGenericClass"})
 @GridCommonTest(group = "Load Test")
+@RunWith(JUnit4.class)
 public class GridifySingleSplitLoadTest extends GridCommonAbstractTest {
     /** */
     public GridifySingleSplitLoadTest() {
@@ -45,7 +48,6 @@ public GridifySingleSplitLoadTest() {
 
 
     /** {@inheritDoc} */
-    @SuppressWarnings("ConstantConditions")
     @Override public String getTestIgniteInstanceName() {
         // Gridify task has empty Ignite instance name by default so we need to change it
         // here.
@@ -99,7 +101,7 @@ private int getThreadCount() {
      *
      * @throws Exception If task execution failed.
      */
-    @SuppressWarnings("unchecked")
+    @Test
     public void testGridifyLoad() throws Exception {
         Ignite ignite = G.ignite(getTestIgniteInstanceName());
 
diff --git a/modules/aop/src/test/java/org/test/gridify/ExternalNonSpringAopSelfTest.java b/modules/aop/src/test/java/org/test/gridify/ExternalNonSpringAopSelfTest.java
index 44fa48d3b73c..55017339e63c 100644
--- a/modules/aop/src/test/java/org/test/gridify/ExternalNonSpringAopSelfTest.java
+++ b/modules/aop/src/test/java/org/test/gridify/ExternalNonSpringAopSelfTest.java
@@ -26,6 +26,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testframework.junits.common.GridCommonTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * To run this test with JBoss AOP make sure of the following:
@@ -52,6 +55,7 @@
  * 2. Classpath should contains the ${IGNITE_HOME}/modules/tests/config/aop/aspectj folder.
  */
 @GridCommonTest(group="AOP")
+@RunWith(JUnit4.class)
 public class ExternalNonSpringAopSelfTest extends GridCommonAbstractTest {
     /** */
     private DeploymentMode depMode = DeploymentMode.PRIVATE;
@@ -79,6 +83,7 @@ private void deployTask() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultPrivate() throws Exception {
         checkDefault(DeploymentMode.PRIVATE);
     }
@@ -86,6 +91,7 @@ public void testDefaultPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultIsolated() throws Exception {
         checkDefault(DeploymentMode.ISOLATED);
     }
@@ -93,6 +99,7 @@ public void testDefaultIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultContinuous() throws Exception {
         checkDefault(DeploymentMode.CONTINUOUS);
     }
@@ -100,6 +107,7 @@ public void testDefaultContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultShared() throws Exception {
         checkDefault(DeploymentMode.SHARED);
     }
@@ -107,6 +115,7 @@ public void testDefaultShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassPrivate() throws Exception {
         checkNonDefaultClass(DeploymentMode.PRIVATE);
     }
@@ -114,6 +123,7 @@ public void testNonDefaultClassPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassIsolated() throws Exception {
         checkNonDefaultClass(DeploymentMode.ISOLATED);
     }
@@ -121,6 +131,7 @@ public void testNonDefaultClassIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultContinuous() throws Exception {
         checkNonDefaultClass(DeploymentMode.CONTINUOUS);
     }
@@ -128,6 +139,7 @@ public void testNonDefaultContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultShared() throws Exception {
         checkNonDefaultClass(DeploymentMode.SHARED);
     }
@@ -135,6 +147,7 @@ public void testNonDefaultShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNamePrivate() throws Exception {
         checkNonDefaultName(DeploymentMode.PRIVATE);
     }
@@ -142,6 +155,7 @@ public void testNonDefaultNamePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameIsolated() throws Exception {
         checkNonDefaultName(DeploymentMode.ISOLATED);
     }
@@ -149,6 +163,7 @@ public void testNonDefaultNameIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameContinuous() throws Exception {
         checkNonDefaultName(DeploymentMode.CONTINUOUS);
     }
@@ -156,6 +171,7 @@ public void testNonDefaultNameContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameShared() throws Exception {
         checkNonDefaultName(DeploymentMode.SHARED);
     }
@@ -163,6 +179,7 @@ public void testNonDefaultNameShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testTaskNameAndTaskClassPrivate() throws Exception {
         checkTaskNameAndTaskClass(DeploymentMode.PRIVATE);
     }
@@ -170,6 +187,7 @@ public void testTaskNameAndTaskClassPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testTaskNameAndTaskClassIsolated() throws Exception {
         checkTaskNameAndTaskClass(DeploymentMode.ISOLATED);
     }
@@ -177,6 +195,7 @@ public void testTaskNameAndTaskClassIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testTaskNameAndTaskClassContinuous() throws Exception {
         checkTaskNameAndTaskClass(DeploymentMode.CONTINUOUS);
     }
@@ -184,6 +203,7 @@ public void testTaskNameAndTaskClassContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testTaskNameAndTaskClassShared() throws Exception {
         checkTaskNameAndTaskClass(DeploymentMode.SHARED);
     }
@@ -191,6 +211,7 @@ public void testTaskNameAndTaskClassShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionPrivate() throws Exception {
         checkDefaultException(DeploymentMode.PRIVATE);
     }
@@ -198,6 +219,7 @@ public void testDefaultExceptionPrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionIsolated() throws Exception {
         checkDefaultException(DeploymentMode.ISOLATED);
     }
@@ -205,6 +227,7 @@ public void testDefaultExceptionIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionContinuous() throws Exception {
         checkDefaultException(DeploymentMode.CONTINUOUS);
     }
@@ -212,6 +235,7 @@ public void testDefaultExceptionContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultExceptionShared() throws Exception {
         checkDefaultException(DeploymentMode.SHARED);
     }
@@ -219,6 +243,7 @@ public void testDefaultExceptionShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourcePrivate() throws Exception {
         checkDefaultResource(DeploymentMode.PRIVATE);
     }
@@ -226,6 +251,7 @@ public void testDefaultResourcePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceIsolated() throws Exception {
         checkDefaultResource(DeploymentMode.ISOLATED);
     }
@@ -233,6 +259,7 @@ public void testDefaultResourceIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceContinuous() throws Exception {
         checkDefaultResource(DeploymentMode.CONTINUOUS);
     }
@@ -240,6 +267,7 @@ public void testDefaultResourceContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testDefaultResourceShared() throws Exception {
         checkDefaultResource(DeploymentMode.SHARED);
     }
@@ -247,6 +275,7 @@ public void testDefaultResourceShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourcePrivate() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.PRIVATE);
     }
@@ -254,6 +283,7 @@ public void testNonDefaultClassResourcePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourceIsolated() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.ISOLATED);
     }
@@ -261,6 +291,7 @@ public void testNonDefaultClassResourceIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourceContinuous() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.CONTINUOUS);
     }
@@ -268,6 +299,7 @@ public void testNonDefaultClassResourceContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultClassResourceShared() throws Exception {
         checkNonDefaultClassResource(DeploymentMode.SHARED);
     }
@@ -275,6 +307,7 @@ public void testNonDefaultClassResourceShared() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourcePrivate() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.PRIVATE);
     }
@@ -282,6 +315,7 @@ public void testNonDefaultNameResourcePrivate() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourceIsolated() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.ISOLATED);
     }
@@ -289,6 +323,7 @@ public void testNonDefaultNameResourceIsolated() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourceContinuous() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.CONTINUOUS);
     }
@@ -296,6 +331,7 @@ public void testNonDefaultNameResourceContinuous() throws Exception {
     /**
      * @throws Exception If test failed.
      */
+    @Test
     public void testNonDefaultNameResourceShared() throws Exception {
         checkNonDefaultNameResource(DeploymentMode.SHARED);
     }
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointManagerSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointManagerSelfTest.java
index acda385d5fb7..7816e7ba0af4 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointManagerSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointManagerSelfTest.java
@@ -23,10 +23,14 @@
 import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManagerAbstractSelfTest;
 import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Checkpoint manager test using {@link S3CheckpointSpi}.
  */
+@RunWith(JUnit4.class)
 public class S3CheckpointManagerSelfTest extends GridCheckpointManagerAbstractSelfTest {
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
@@ -52,6 +56,7 @@
      * @throws Exception Thrown if any exception occurs.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     public void testS3Based() throws Exception {
         retries = 6;
 
@@ -62,9 +67,10 @@ public void testS3Based() throws Exception {
      * @throws Exception Thrown if any exception occurs.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     public void testMultiNodeS3Based() throws Exception {
         retries = 6;
 
         doMultiNodeTest("s3");
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiConfigSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiConfigSelfTest.java
index 727845b0d991..446c715e0c96 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiConfigSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiConfigSelfTest.java
@@ -19,16 +19,21 @@
 
 import org.apache.ignite.testframework.junits.spi.GridSpiAbstractConfigTest;
 import org.apache.ignite.testframework.junits.spi.GridSpiTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid S3 checkpoint SPI config self test.
  */
 @GridSpiTest(spi = S3CheckpointSpi.class, group = "Checkpoint SPI")
+@RunWith(JUnit4.class)
 public class S3CheckpointSpiConfigSelfTest extends GridSpiAbstractConfigTest<S3CheckpointSpi> {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNegativeConfig() throws Exception {
         checkNegativeSpiProperty(new S3CheckpointSpi(), "awsCredentials", null);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiSelfTest.java
index cb38083506e6..a25b5be481a5 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiSelfTest.java
@@ -39,11 +39,15 @@
 import org.apache.ignite.testframework.junits.spi.GridSpiTest;
 import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid S3 checkpoint SPI self test.
  */
 @GridSpiTest(spi = S3CheckpointSpi.class, group = "Checkpoint SPI")
+@RunWith(JUnit4.class)
 public class S3CheckpointSpiSelfTest extends GridSpiAbstractTest<S3CheckpointSpi> {
     /** */
     private static final int CHECK_POINT_COUNT = 10;
@@ -96,6 +100,7 @@
      * @throws Exception Thrown in case of any errors.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     public void testSaveLoadRemoveWithoutExpire() throws Exception {
         String dataPrefix = "Test check point data ";
 
@@ -155,6 +160,7 @@ public void testSaveLoadRemoveWithoutExpire() throws Exception {
      * @throws Exception Thrown in case of any errors.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     public void testSaveWithExpire() throws Exception {
         // Save states.
         for (int i = 0; i < CHECK_POINT_COUNT; i++) {
@@ -183,6 +189,7 @@ public void testSaveWithExpire() throws Exception {
      * @throws Exception Thrown in case of any errors.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     public void testDuplicates() throws Exception {
         int idx1 = 1;
         int idx2 = 2;
@@ -246,4 +253,4 @@ static String getBucketNameSuffix() {
 
         return bucketNameSuffix;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopBucketEndpointSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopBucketEndpointSelfTest.java
index a50b7a3d7162..363f7687c7a3 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopBucketEndpointSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopBucketEndpointSelfTest.java
@@ -21,15 +21,18 @@
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.spi.GridSpiStartStopAbstractTest;
 import org.apache.ignite.testframework.junits.spi.GridSpiTest;
-import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid S3 checkpoint SPI start stop self test.
  */
 @GridSpiTest(spi = S3CheckpointSpi.class, group = "Checkpoint SPI")
+@RunWith(JUnit4.class)
 public class S3CheckpointSpiStartStopBucketEndpointSelfTest extends GridSpiStartStopAbstractTest<S3CheckpointSpi> {
-
     /** {@inheritDoc} */
     @Override protected void spiConfigure(S3CheckpointSpi spi) throws Exception {
         AWSCredentials cred = new BasicAWSCredentials(IgniteS3TestSuite.getAccessKey(),
@@ -43,8 +46,9 @@
     }
 
     /** {@inheritDoc} */
-    @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Ignore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     @Override public void testStartStop() throws Exception {
         super.testStartStop();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSSEAlgorithmSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSSEAlgorithmSelfTest.java
index 7bfb75dd7888..cf4495225abd 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSSEAlgorithmSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSSEAlgorithmSelfTest.java
@@ -21,13 +21,17 @@
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.spi.GridSpiStartStopAbstractTest;
 import org.apache.ignite.testframework.junits.spi.GridSpiTest;
-import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid S3 checkpoint SPI start stop self test.
  */
 @GridSpiTest(spi = S3CheckpointSpi.class, group = "Checkpoint SPI")
+@RunWith(JUnit4.class)
 public class S3CheckpointSpiStartStopSSEAlgorithmSelfTest extends GridSpiStartStopAbstractTest<S3CheckpointSpi> {
     /** {@inheritDoc} */
     @Override protected void spiConfigure(S3CheckpointSpi spi) throws Exception {
@@ -42,8 +46,9 @@
     }
 
     /** {@inheritDoc} */
-    @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Ignore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     @Override public void testStartStop() throws Exception {
         super.testStartStop();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSelfTest.java
index a062b51f28e3..5fec5027d1cd 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3CheckpointSpiStartStopSelfTest.java
@@ -23,11 +23,15 @@
 import org.apache.ignite.testframework.junits.spi.GridSpiTest;
 import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid S3 checkpoint SPI start stop self test.
  */
 @GridSpiTest(spi = S3CheckpointSpi.class, group = "Checkpoint SPI")
+@RunWith(JUnit4.class)
 public class S3CheckpointSpiStartStopSelfTest extends GridSpiStartStopAbstractTest<S3CheckpointSpi> {
     /** {@inheritDoc} */
     @Override protected void spiConfigure(S3CheckpointSpi spi) throws Exception {
@@ -43,7 +47,8 @@
 
     /** {@inheritDoc} */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     @Override public void testStartStop() throws Exception {
         super.testStartStop();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3SessionCheckpointSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3SessionCheckpointSelfTest.java
index 54a7910d030f..99a0cc5e8ba5 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3SessionCheckpointSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/checkpoint/s3/S3SessionCheckpointSelfTest.java
@@ -24,15 +24,20 @@
 import org.apache.ignite.session.GridSessionCheckpointSelfTest;
 import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid session checkpoint self test using {@link S3CheckpointSpi}.
  */
+@RunWith(JUnit4.class)
 public class S3SessionCheckpointSelfTest extends GridSessionCheckpointAbstractSelfTest {
     /**
      * @throws Exception If failed.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     public void testS3Checkpoint() throws Exception {
         IgniteConfiguration cfg = getConfiguration();
 
@@ -51,4 +56,4 @@ public void testS3Checkpoint() throws Exception {
 
         checkCheckpoints(cfg);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/elb/TcpDiscoveryElbIpFinderSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/elb/TcpDiscoveryElbIpFinderSelfTest.java
index 1217d8b4f98e..85568f0f5054 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/elb/TcpDiscoveryElbIpFinderSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/elb/TcpDiscoveryElbIpFinderSelfTest.java
@@ -19,10 +19,14 @@
 
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinderAbstractSelfTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * TcpDiscoveryElbIpFinderSelfTest test.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryElbIpFinderSelfTest extends TcpDiscoveryIpFinderAbstractSelfTest<TcpDiscoveryElbIpFinder> {
     /**
      * Constructor.
@@ -44,6 +48,7 @@ public TcpDiscoveryElbIpFinderSelfTest() throws Exception {
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testIpFinder() throws Exception {
         TcpDiscoveryElbIpFinder ipFinder = new TcpDiscoveryElbIpFinder();
 
@@ -78,4 +83,4 @@ public TcpDiscoveryElbIpFinderSelfTest() throws Exception {
             assertTrue(e.getMessage().startsWith("One or more configuration parameters are invalid"));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAbstractSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAbstractSelfTest.java
index 768e44da70f3..37a0accc208f 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAbstractSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAbstractSelfTest.java
@@ -27,10 +27,14 @@
 import org.apache.ignite.testsuites.IgniteIgnore;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Abstract TcpDiscoveryS3IpFinder to test with different ways of setting AWS credentials.
  */
+@RunWith(JUnit4.class)
 abstract class TcpDiscoveryS3IpFinderAbstractSelfTest
     extends TcpDiscoveryIpFinderAbstractSelfTest<TcpDiscoveryS3IpFinder> {
     /** Bucket endpoint */
@@ -83,6 +87,7 @@
 
     /** {@inheritDoc} */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-2420")
+    @Test
     @Override public void testIpFinder() throws Exception {
         super.testIpFinder();
     }
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest.java
index 9ff5571a26e5..06524d24d8cd 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest.java
@@ -20,10 +20,14 @@
 import com.amazonaws.auth.AWSStaticCredentialsProvider;
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * TcpDiscoveryS3IpFinder test using AWS credentials provider.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest extends TcpDiscoveryS3IpFinderAbstractSelfTest {
     /**
      * Constructor.
@@ -41,7 +45,8 @@ public TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest() throws Exception {
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testIpFinder() throws Exception {
         super.testIpFinder();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsSelfTest.java
index 5bea2515530c..db287108016c 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderAwsCredentialsSelfTest.java
@@ -19,10 +19,14 @@
 
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * TcpDiscoveryS3IpFinder test using AWS credentials.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryS3IpFinderAwsCredentialsSelfTest extends TcpDiscoveryS3IpFinderAbstractSelfTest {
     /**
      * Constructor.
@@ -40,7 +44,8 @@ public TcpDiscoveryS3IpFinderAwsCredentialsSelfTest() throws Exception {
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testIpFinder() throws Exception {
         super.testIpFinder();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderBucketEndpointSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderBucketEndpointSelfTest.java
index 07d4839d959d..11481d8f4228 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderBucketEndpointSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderBucketEndpointSelfTest.java
@@ -19,12 +19,16 @@
 
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * TcpDiscoveryS3IpFinder tests bucket endpoint for IP finder.
  * For information about possible endpoint names visit
  * <a href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region">docs.aws.amazon.com</a>.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryS3IpFinderBucketEndpointSelfTest extends TcpDiscoveryS3IpFinderAbstractSelfTest {
     /**
      * Constructor.
@@ -49,6 +53,7 @@ public TcpDiscoveryS3IpFinderBucketEndpointSelfTest() throws Exception {
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testIpFinder() throws Exception {
         super.testIpFinder();
     }
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderKeyPrefixSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderKeyPrefixSelfTest.java
index 6e4960bdb393..bb01f0b4e850 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderKeyPrefixSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderKeyPrefixSelfTest.java
@@ -19,12 +19,16 @@
 
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.s3.client.DummyS3Client;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 import org.mockito.Mockito;
 
 /**
  * TcpDiscoveryS3IpFinder tests key prefix for IP finder. For information about key prefix visit:
  * <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html"/>.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryS3IpFinderKeyPrefixSelfTest extends TcpDiscoveryS3IpFinderAbstractSelfTest {
     /**
      * Constructor.
@@ -58,6 +62,7 @@ public TcpDiscoveryS3IpFinderKeyPrefixSelfTest() throws Exception {
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testIpFinder() throws Exception {
         injectLogger(finder);
 
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest.java
index 838a3c67f37c..b909fac99add 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest.java
@@ -19,12 +19,16 @@
 
 import com.amazonaws.auth.BasicAWSCredentials;
 import org.apache.ignite.testsuites.IgniteS3TestSuite;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * TcpDiscoveryS3IpFinder tests server-side encryption algorithm for Amazon S3-managed encryption keys.
  * For information about possible S3-managed encryption keys visit
  * <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html">docs.aws.amazon.com</a>.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest extends TcpDiscoveryS3IpFinderAbstractSelfTest {
     /**
      * Constructor.
@@ -42,7 +46,8 @@ public TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest() throws Exception {
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testIpFinder() throws Exception {
         super.testIpFinder();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyObjectListingTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyObjectListingTest.java
index 2598af0c7af5..9016b52f5de2 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyObjectListingTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyObjectListingTest.java
@@ -23,14 +23,19 @@
 import java.util.List;
 import java.util.Set;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Class to test {@link DummyObjectListing}.
  */
+@RunWith(JUnit4.class)
 public class DummyObjectListingTest extends GridCommonAbstractTest {
     /**
      * Test cases for various object listing functions for S3 bucket.
      */
+    @Test
     public void testDummyObjectListing() {
         Set<String> fakeKeyPrefixSet = new HashSet<>();
 
diff --git a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyS3ClientTest.java b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyS3ClientTest.java
index bd1b12fd548f..88c205c629e3 100644
--- a/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyS3ClientTest.java
+++ b/modules/aws/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/s3/client/DummyS3ClientTest.java
@@ -26,10 +26,14 @@
 import java.util.Map;
 import java.util.Set;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Class to test {@link DummyS3Client}.
  */
+@RunWith(JUnit4.class)
 public class DummyS3ClientTest extends GridCommonAbstractTest {
     /** Instance of {@link DummyS3Client} to be used for tests. */
     private DummyS3Client s3;
@@ -54,6 +58,7 @@
     /**
      * Test cases to check the 'doesBucketExist' method.
      */
+    @Test
     public void testDoesBucketExist() {
         assertTrue("The bucket 'testBucket' should exist", s3.doesBucketExist("testBucket"));
         assertFalse("The bucket 'nonExistentBucket' should not exist", s3.doesBucketExist("nonExistentBucket"));
@@ -62,6 +67,7 @@ public void testDoesBucketExist() {
     /**
      * Test cases for various object listing functions for S3 bucket.
      */
+    @Test
     public void testListObjects() {
         ObjectListing listing = s3.listObjects("testBucket");
 
@@ -98,6 +104,7 @@ public void testListObjects() {
     /**
      * Test cases for various object listing functions for S3 bucket and key prefix.
      */
+    @Test
     public void testListObjectsWithAPrefix() {
         ObjectListing listing = s3.listObjects("testBucket", "/test");
 
@@ -149,6 +156,7 @@ public void testListObjectsWithAPrefix() {
     /**
      * Test case to check if a bucket is created properly.
      */
+    @Test
     public void testCreateBucket() {
         s3.createBucket("testBucket1");
 
diff --git a/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteElbTestSuite.java b/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteElbTestSuite.java
index 28f7e0e47ec6..5c6566da1941 100644
--- a/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteElbTestSuite.java
+++ b/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteElbTestSuite.java
@@ -17,22 +17,25 @@
 
 package org.apache.ignite.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.elb.TcpDiscoveryElbIpFinderSelfTest;
 import org.apache.ignite.testframework.IgniteTestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 /**
  * ELB IP finder test suite.
  */
-public class IgniteElbTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteElbTestSuite {
     /**
      * @return Test suite.
-     * @throws Exception Thrown in case of the failure.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new IgniteTestSuite("ELB Integration Test Suite");
 
-        suite.addTestSuite(TcpDiscoveryElbIpFinderSelfTest.class);
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryElbIpFinderSelfTest.class));
 
         return suite;
     }
diff --git a/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteS3TestSuite.java b/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteS3TestSuite.java
index a5b5eaabf12a..1b28376b6d69 100644
--- a/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteS3TestSuite.java
+++ b/modules/aws/src/test/java/org/apache/ignite/testsuites/IgniteS3TestSuite.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.spi.checkpoint.s3.S3CheckpointManagerSelfTest;
 import org.apache.ignite.spi.checkpoint.s3.S3CheckpointSpiConfigSelfTest;
@@ -33,35 +34,37 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.s3.client.DummyObjectListingTest;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.s3.client.DummyS3ClientTest;
 import org.apache.ignite.testframework.IgniteTestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 /**
  * S3 integration tests.
  */
-public class IgniteS3TestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteS3TestSuite {
     /**
      * @return Test suite.
-     * @throws Exception Thrown in case of the failure.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new IgniteTestSuite("S3 Integration Test Suite");
 
         // Checkpoint SPI.
-        suite.addTestSuite(S3CheckpointSpiConfigSelfTest.class);
-        suite.addTestSuite(S3CheckpointSpiSelfTest.class);
-        suite.addTestSuite(S3CheckpointSpiStartStopSelfTest.class);
-        suite.addTestSuite(S3CheckpointManagerSelfTest.class);
-        suite.addTestSuite(S3SessionCheckpointSelfTest.class);
-        suite.addTestSuite(S3CheckpointSpiStartStopBucketEndpointSelfTest.class);
-        suite.addTestSuite(S3CheckpointSpiStartStopSSEAlgorithmSelfTest.class);
+        suite.addTest(new JUnit4TestAdapter(S3CheckpointSpiConfigSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(S3CheckpointSpiSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(S3CheckpointSpiStartStopSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(S3CheckpointManagerSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(S3SessionCheckpointSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(S3CheckpointSpiStartStopBucketEndpointSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(S3CheckpointSpiStartStopSSEAlgorithmSelfTest.class));
 
         // S3 IP finder.
-        suite.addTestSuite(DummyS3ClientTest.class);
-        suite.addTestSuite(DummyObjectListingTest.class);
-        suite.addTestSuite(TcpDiscoveryS3IpFinderAwsCredentialsSelfTest.class);
-        suite.addTestSuite(TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest.class);
-        suite.addTestSuite(TcpDiscoveryS3IpFinderBucketEndpointSelfTest.class);
-        suite.addTestSuite(TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest.class);
-        suite.addTestSuite(TcpDiscoveryS3IpFinderKeyPrefixSelfTest.class);
+        suite.addTest(new JUnit4TestAdapter(DummyS3ClientTest.class));
+        suite.addTest(new JUnit4TestAdapter(DummyObjectListingTest.class));
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryS3IpFinderAwsCredentialsSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryS3IpFinderAwsCredentialsProviderSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryS3IpFinderBucketEndpointSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryS3IpFinderSSEAlgorithmSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryS3IpFinderKeyPrefixSelfTest.class));
 
         return suite;
     }
diff --git a/modules/benchmarks/pom.xml b/modules/benchmarks/pom.xml
index 1ea984c6c544..06e0e505cd2a 100644
--- a/modules/benchmarks/pom.xml
+++ b/modules/benchmarks/pom.xml
@@ -62,6 +62,16 @@
             <version>${jmh.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>${mockito.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -131,4 +141,4 @@
             </plugins>
         </pluginManagement>
     </build>
-</project>
\ No newline at end of file
+</project>
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/algo/BenchmarkCRC.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/algo/BenchmarkCRC.java
new file mode 100644
index 000000000000..5c922fead0c8
--- /dev/null
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/algo/BenchmarkCRC.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.benchmarks.jmh.algo;
+
+import org.apache.ignite.internal.processors.cache.persistence.wal.crc.FastCrc;
+import org.apache.ignite.internal.processors.cache.persistence.wal.crc.PureJavaCrc32;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.nio.ByteBuffer;
+import java.util.Random;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.openjdk.jmh.annotations.Mode.AverageTime;
+import static org.openjdk.jmh.annotations.Scope.Thread;
+
+/**
+ *
+ */
+@State(Thread)
+@OutputTimeUnit(NANOSECONDS)
+@BenchmarkMode(AverageTime)
+@Fork(value = 1, jvmArgsAppend = {"-XX:+UnlockDiagnosticVMOptions"})
+@Warmup(iterations = 5)
+@Measurement(iterations = 5)
+public class BenchmarkCRC {
+    /** */
+    static final int SIZE = 1024;
+
+    /** */
+    static final int BUF_LEN = 4096;
+
+    /** */
+    @State(Thread)
+    public static class Context {
+        /** */
+        final int[] results = new int[SIZE];
+
+        /** */
+        final ByteBuffer bb = ByteBuffer.allocate(BUF_LEN);
+
+        /** */
+        @Setup
+        public void setup() {
+            new Random().ints(BUF_LEN, Byte.MIN_VALUE, Byte.MAX_VALUE).forEach(k -> bb.put((byte) k));
+        }
+    }
+
+    /** */
+    @Benchmark
+    public int[] pureJavaCrc32(Context context) {
+        for (int i = 0; i < SIZE; i++) {
+            context.bb.rewind();
+
+            context.results[i] = PureJavaCrc32.calcCrc32(context.bb, BUF_LEN);
+        }
+
+        return context.results;
+    }
+
+    /** */
+    @Benchmark
+    public int[] crc32(Context context) {
+        for (int i = 0; i < SIZE; i++) {
+            context.bb.rewind();
+
+            context.results[i] = FastCrc.calcCrc(context.bb, BUF_LEN);
+        }
+
+        return context.results;
+    }
+}
+
+
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/encryption/JmhKeystoreEncryptionSpiBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/encryption/JmhKeystoreEncryptionSpiBenchmark.java
new file mode 100644
index 000000000000..932d57e17261
--- /dev/null
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/encryption/JmhKeystoreEncryptionSpiBenchmark.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.benchmarks.jmh.encryption;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.ThreadLocalRandom;
+import org.apache.ignite.internal.benchmarks.jmh.JmhAbstractBenchmark;
+import org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionKey;
+import org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import static org.apache.ignite.internal.util.IgniteUtils.resolveIgnitePath;
+
+/**
+ */
+public class JmhKeystoreEncryptionSpiBenchmark extends JmhAbstractBenchmark {
+    /** Data amount. */
+    private static final int DATA_AMOUNT = 100;
+
+    public static final int PAGE_SIZE = 1024 * 4;
+
+    /** */
+    @Benchmark
+    public void encryptBenchmark(EncryptionData d, Blackhole receiver) {
+        for (int i = 0; i < DATA_AMOUNT; i++) {
+            ByteBuffer[] dt = d.randomData[i];
+
+            KeystoreEncryptionKey key = d.keys[ThreadLocalRandom.current().nextInt(4)];
+
+            d.encSpi.encryptNoPadding(dt[0], key, dt[1]);
+
+            receiver.consume(d.res);
+
+            dt[0].rewind();
+            dt[1].rewind();
+
+            d.encSpi.decryptNoPadding(dt[1], key, dt[0]);
+        }
+    }
+
+    @State(Scope.Thread)
+    public static class EncryptionData {
+        KeystoreEncryptionSpi encSpi;
+
+        KeystoreEncryptionKey[] keys = new KeystoreEncryptionKey[4];
+
+        ByteBuffer[][] randomData = new ByteBuffer[DATA_AMOUNT][2];
+
+        ByteBuffer res = ByteBuffer.allocate(PAGE_SIZE);
+
+        public EncryptionData() {
+            encSpi = new KeystoreEncryptionSpi();
+
+            encSpi.setKeyStorePath(resolveIgnitePath("modules/core/src/test/resources/tde.jks").getAbsolutePath());
+            encSpi.setKeyStorePassword("love_sex_god".toCharArray());
+
+            encSpi.onBeforeStart();
+            encSpi.spiStart("test-instance");
+        }
+
+        @Setup(Level.Invocation)
+        public void prepareCollection() {
+            for (int i = 0; i < keys.length; i++)
+                keys[i] = encSpi.create();
+
+            for (int i = 0; i < DATA_AMOUNT; i++) {
+                byte[] dt = new byte[PAGE_SIZE - 16];
+
+                ThreadLocalRandom.current().nextBytes(dt);
+
+                randomData[i][0] = ByteBuffer.wrap(dt);
+                randomData[i][1] = ByteBuffer.allocate(PAGE_SIZE);
+            }
+        }
+
+        @TearDown(Level.Iteration)
+        public void tearDown() {
+            //No - op
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        Options opt = new OptionsBuilder()
+            .include(JmhKeystoreEncryptionSpiBenchmark.class.getSimpleName())
+            .threads(1)
+            .forks(1)
+            .warmupIterations(10)
+            .measurementIterations(20)
+            .build();
+
+        new Runner(opt).run();
+    }
+}
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/misc/GridDhtPartitionsStateValidatorBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/misc/GridDhtPartitionsStateValidatorBenchmark.java
new file mode 100644
index 000000000000..f3bbcb96d6cb
--- /dev/null
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/misc/GridDhtPartitionsStateValidatorBenchmark.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.benchmarks.jmh.misc;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.apache.ignite.internal.benchmarks.jmh.JmhAbstractBenchmark;
+import org.apache.ignite.internal.benchmarks.jmh.runner.JmhIdeBenchmarkRunner;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessage;
+import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtLocalPartition;
+import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState;
+import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionTopology;
+import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionsStateValidator;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.jetbrains.annotations.Nullable;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.IntStream;
+
+import static org.openjdk.jmh.annotations.Scope.Thread;
+
+/** */
+@State(Scope.Benchmark)
+public class GridDhtPartitionsStateValidatorBenchmark extends JmhAbstractBenchmark {
+    /** */
+    @State(Thread)
+    public static class Context {
+        /** */
+        private final UUID localNodeId = UUID.randomUUID();
+
+        /** */
+        private GridCacheSharedContext cctxMock;
+
+        /** */
+        private GridDhtPartitionTopology topologyMock;
+
+        /** */
+        private GridDhtPartitionsStateValidator validator;
+
+        /** */
+        private Map<UUID, GridDhtPartitionsSingleMessage> messages = new HashMap<>();
+
+        /** */
+        private UUID ignoreNode = UUID.randomUUID();
+
+        /** */
+        private static final int NODES = 3;
+
+        /** */
+        private static final int PARTS = 100;
+
+        /**
+         * @return Partition mock with specified {@code id}, {@code updateCounter} and {@code size}.
+         */
+        private GridDhtLocalPartition partitionMock(int id, long updateCounter, long size) {
+            GridDhtLocalPartition partitionMock = Mockito.mock(GridDhtLocalPartition.class);
+            Mockito.when(partitionMock.id()).thenReturn(id);
+            Mockito.when(partitionMock.updateCounter()).thenReturn(updateCounter);
+            Mockito.when(partitionMock.fullSize()).thenReturn(size);
+            Mockito.when(partitionMock.state()).thenReturn(GridDhtPartitionState.OWNING);
+            return partitionMock;
+        }
+
+        /**
+         * @param countersMap Update counters map.
+         * @param sizesMap Sizes map.
+         * @return Message with specified {@code countersMap} and {@code sizeMap}.
+         */
+        private GridDhtPartitionsSingleMessage from(@Nullable Map<Integer, T2<Long, Long>> countersMap, @Nullable Map<Integer, Long> sizesMap) {
+            GridDhtPartitionsSingleMessage msg = new GridDhtPartitionsSingleMessage();
+            if (countersMap != null)
+                msg.addPartitionUpdateCounters(0, countersMap);
+            if (sizesMap != null)
+                msg.addPartitionSizes(0, sizesMap);
+            return msg;
+        }
+
+        /** */
+        @Setup
+        public void setup() {
+            // Prepare mocks.
+            cctxMock = Mockito.mock(GridCacheSharedContext.class);
+            Mockito.when(cctxMock.localNodeId()).thenReturn(localNodeId);
+
+            topologyMock = Mockito.mock(GridDhtPartitionTopology.class);
+            Mockito.when(topologyMock.partitionState(Matchers.any(), Matchers.anyInt())).thenReturn(GridDhtPartitionState.OWNING);
+            Mockito.when(topologyMock.groupId()).thenReturn(0);
+
+            Mockito.when(topologyMock.partitions()).thenReturn(PARTS);
+
+            List<GridDhtLocalPartition> localPartitions = Lists.newArrayList();
+
+            Map<Integer, T2<Long, Long>> updateCountersMap = new HashMap<>();
+
+            Map<Integer, Long> cacheSizesMap = new HashMap<>();
+
+            IntStream.range(0, PARTS).forEach(k -> { localPartitions.add(partitionMock(k, k + 1, k + 1));
+                long us = k > 20 && k <= 30 ? 0 :k + 2L;
+                updateCountersMap.put(k, new T2<>(k + 2L, us));
+                cacheSizesMap.put(k, us); });
+
+            Mockito.when(topologyMock.localPartitions()).thenReturn(localPartitions);
+            Mockito.when(topologyMock.currentLocalPartitions()).thenReturn(localPartitions);
+
+            // Form single messages map.
+            Map<UUID, GridDhtPartitionsSingleMessage> messages = new HashMap<>();
+
+            for (int n = 0; n < NODES; ++n) {
+                UUID remoteNode = UUID.randomUUID();
+
+                messages.put(remoteNode, from(updateCountersMap, cacheSizesMap));
+            }
+
+            messages.put(ignoreNode, from(updateCountersMap, cacheSizesMap));
+
+            validator = new GridDhtPartitionsStateValidator(cctxMock);
+        }
+    }
+
+    /** */
+    @Benchmark
+    public void testValidatePartitionsUpdateCounters(Context context) {
+        context.validator.validatePartitionsUpdateCounters(context.topologyMock,
+                context.messages, Sets.newHashSet(context.ignoreNode));
+    }
+
+    /** */
+    @Benchmark
+    public void testValidatePartitionsSizes(Context context) {
+        context.validator.validatePartitionsSizes(context.topologyMock, context
+                .messages, Sets.newHashSet(context.ignoreNode));
+    }
+
+    /**
+     * Run benchmarks.
+     *
+     * @param args Arguments.
+     * @throws Exception If failed.
+     */
+    public static void main(String[] args) throws Exception {
+        run(1);
+    }
+
+    /**
+     * Run benchmark.
+     *
+     * @param threads Amount of threads.
+     * @throws Exception If failed.
+     */
+    private static void run(int threads) throws Exception {
+        JmhIdeBenchmarkRunner.create()
+                .forks(1)
+                .threads(threads)
+                .warmupIterations(5)
+                .measurementIterations(10)
+                .benchmarks(GridDhtPartitionsStateValidatorBenchmark.class.getSimpleName())
+                .jvmArguments("-XX:+UseG1GC", "-Xms4g", "-Xmx4g")
+                .run();
+    }
+}
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
index e80e13d52d4b..15c47106a9a7 100644
--- a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
@@ -137,7 +137,7 @@ public void setup() throws Exception {
     public void tearDown() throws Exception {
         tree.destroy();
 
-        pageMem.stop();
+        pageMem.stop(true);
     }
 
     /**
diff --git a/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTest.java b/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTest.java
index 88b7eb884575..b384d1a29420 100644
--- a/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTest.java
+++ b/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTest.java
@@ -56,12 +56,16 @@
 import org.apache.ignite.stream.StreamMultipleTupleExtractor;
 import org.apache.ignite.stream.StreamSingleTupleExtractor;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT;
 
 /**
  * Test class for {@link CamelStreamer}.
  */
+@RunWith(JUnit4.class)
 public class IgniteCamelStreamerTest extends GridCommonAbstractTest {
     /** text/plain media type. */
     private static final MediaType TEXT_PLAIN = MediaType.parse("text/plain;charset=utf-8");
@@ -127,6 +131,7 @@ public IgniteCamelStreamerTest() {
     /**
      * @throws Exception
      */
+    @Test
     public void testSendOneEntryPerMessage() throws Exception {
         streamer.setSingleTupleExtractor(singleTupleExtractor());
 
@@ -147,6 +152,7 @@ public void testSendOneEntryPerMessage() throws Exception {
     /**
      * @throws Exception
      */
+    @Test
     public void testMultipleEntriesInOneMessage() throws Exception {
         streamer.setMultipleTupleExtractor(multipleTupleExtractor());
 
@@ -167,6 +173,7 @@ public void testMultipleEntriesInOneMessage() throws Exception {
     /**
      * @throws Exception
      */
+    @Test
     public void testResponseProcessorIsCalled() throws Exception {
         streamer.setSingleTupleExtractor(singleTupleExtractor());
         streamer.setResponseProcessor(new Processor() {
@@ -195,6 +202,7 @@ public void testResponseProcessorIsCalled() throws Exception {
     /**
      * @throws Exception
      */
+    @Test
     public void testUserSpecifiedCamelContext() throws Exception {
         final AtomicInteger cnt = new AtomicInteger();
 
@@ -228,6 +236,7 @@ public void testUserSpecifiedCamelContext() throws Exception {
     /**
      * @throws Exception
      */
+    @Test
     public void testUserSpecifiedCamelContextWithPropertyPlaceholders() throws Exception {
         // Create a CamelContext with a custom property placeholder.
         CamelContext context = new DefaultCamelContext();
@@ -266,6 +275,7 @@ public void testUserSpecifiedCamelContextWithPropertyPlaceholders() throws Excep
     /**
      * @throws Exception
      */
+    @Test
     public void testInvalidEndpointUri() throws Exception {
         streamer.setSingleTupleExtractor(singleTupleExtractor());
         streamer.setEndpointUri("abc");
diff --git a/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTestSuite.java b/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTestSuite.java
index c45272ed00c5..8e9f0b10fa07 100644
--- a/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTestSuite.java
+++ b/modules/camel/src/test/java/org/apache/ignite/stream/camel/IgniteCamelStreamerTestSuite.java
@@ -18,29 +18,31 @@
 package org.apache.ignite.stream.camel;
 
 import java.util.Set;
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 /**
  * Camel streamer tests. Included into 'Streamers' run configuration.
  */
-public class IgniteCamelStreamerTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteCamelStreamerTestSuite {
     /**
      * @return {@link IgniteCamelStreamerTest} test suite.
-     * @throws Exception Thrown in case of the failure.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         return suite(null);
     }
 
     /**
-     * @param ignoredTests
+     * @param ignoredTests List of ignored tests.
      * @return Test suite.
-     * @throws Exception Thrown in case of the failure.
      */
-    public static TestSuite suite(Set<Class> ignoredTests) throws Exception {
+    public static TestSuite suite(Set<Class> ignoredTests) {
         TestSuite suite = new TestSuite("IgniteCamelStreamer Test Suite");
 
-        suite.addTestSuite(IgniteCamelStreamerTest.class);
+        suite.addTest(new JUnit4TestAdapter(IgniteCamelStreamerTest.class));
 
         return suite;
     }
diff --git a/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraConfigTest.java b/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraConfigTest.java
index 98d7ef1bae92..63ec90b446e8 100644
--- a/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraConfigTest.java
+++ b/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraConfigTest.java
@@ -17,22 +17,22 @@
 
 package org.apache.ignite.tests;
 
-import junit.framework.TestCase;
-import org.apache.ignite.cache.affinity.AffinityKeyMapped;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.cache.store.cassandra.persistence.KeyPersistenceSettings;
 import org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
 
 /**
  * Simple test for DDL generator.
  */
-public class CassandraConfigTest extends TestCase {
+public class CassandraConfigTest {
     /**
      * Check if same DDL generated for similar keys and same KeyPersistenceConfiguration.
-     *
-     * @throws Exception
      */
-    public void testDDLGeneration() throws Exception {
+    @Test
+    public void testDDLGeneration() {
         KeyPersistenceSettings keyPersistenceSettingsA = getKeyPersistenceSettings(KeyA.class);
         KeyPersistenceSettings keyPersistenceSettingsB = getKeyPersistenceSettings(KeyB.class);
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/TaskEventSubjectIdSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/TaskEventSubjectIdSelfTest.java
index 46aaa6ba387b..881122ed09f6 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/TaskEventSubjectIdSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/TaskEventSubjectIdSelfTest.java
@@ -45,6 +45,9 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.ignite.events.EventType.EVTS_TASK_EXECUTION;
@@ -57,6 +60,7 @@
 /**
  * Tests for security subject ID in task events.
  */
+@RunWith(JUnit4.class)
 public class TaskEventSubjectIdSelfTest extends GridCommonAbstractTest {
     /** */
     private static final Collection<TaskEvent> evts = new ArrayList<>();
@@ -117,6 +121,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSimpleTask() throws Exception {
         latch = new CountDownLatch(3);
 
@@ -161,6 +166,7 @@ public void testSimpleTask() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFailedTask() throws Exception {
         latch = new CountDownLatch(2);
 
@@ -207,6 +213,7 @@ public void testFailedTask() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimedOutTask() throws Exception {
         latch = new CountDownLatch(2);
 
@@ -262,6 +269,7 @@ public void testTimedOutTask() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClosure() throws Exception {
         latch = new CountDownLatch(3);
 
@@ -308,8 +316,12 @@ public void testClosure() throws Exception {
     }
 
     /**
+     * Events for class tasks that was started from external clients should contain
+     * client subject id instead of the node where it was started. This test checks it.
+     *
      * @throws Exception If failed.
      */
+    @Test
     public void testClient() throws Exception {
         latch = new CountDownLatch(3);
 
@@ -328,7 +340,7 @@ public void testClient() throws Exception {
         assert evt != null;
 
         assertEquals(EVT_TASK_STARTED, evt.type());
-        assertEquals(nodeId, evt.subjectId());
+        assertEquals(client.id(), evt.subjectId());
 
         assert it.hasNext();
 
@@ -337,7 +349,7 @@ public void testClient() throws Exception {
         assert evt != null;
 
         assertEquals(EVT_TASK_REDUCED, evt.type());
-        assertEquals(nodeId, evt.subjectId());
+        assertEquals(client.id(), evt.subjectId());
 
         assert it.hasNext();
 
@@ -346,7 +358,7 @@ public void testClient() throws Exception {
         assert evt != null;
 
         assertEquals(EVT_TASK_FINISHED, evt.type());
-        assertEquals(nodeId, evt.subjectId());
+        assertEquals(client.id(), evt.subjectId());
 
         assert !it.hasNext();
     }
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
index fb46bb2c8795..2ba00c3eed8e 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
@@ -48,7 +48,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
 import static org.apache.ignite.cache.CacheMode.LOCAL;
@@ -59,6 +61,7 @@
 /**
  *
  */
+@RunWith(JUnit4.class)
 public abstract class ClientAbstractMultiThreadedSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -246,6 +249,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String cacheName) throws
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultithreadedTaskRun() throws Exception {
         final AtomicLong cnt = new AtomicLong();
 
@@ -397,4 +401,4 @@ private GridClientConfiguration clientConfiguration() {
             return locNodeId;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
index c62cf8a547c9..7e4e4f0e72af 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
@@ -41,12 +41,16 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_JETTY_PORT;
 
 /**
  * Tests that client is able to connect to a grid with only default cache enabled.
  */
+@RunWith(JUnit4.class)
 public class ClientDefaultCacheSelfTest extends GridCommonAbstractTest {
     /** Path to jetty config configured with SSL. */
     private static final String REST_JETTY_CFG = "modules/clients/src/test/resources/jetty/rest-jetty.xml";
@@ -183,6 +187,7 @@ private JsonNode jsonResponse(String content) throws IOException {
     /**
      * Json format string in cache should not transform to Json object on get request.
      */
+    @Test
     public void testSkipString2JsonTransformation() throws Exception {
         String val = "{\"v\":\"my Value\",\"t\":1422559650154}";
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientReconnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientReconnectionSelfTest.java
index f1085b3ec361..453243c83f7a 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientReconnectionSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientReconnectionSelfTest.java
@@ -25,10 +25,14 @@
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.testsuites.IgniteIgnore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class ClientReconnectionSelfTest extends GridCommonAbstractTest {
     /** */
     public static final String HOST = "127.0.0.1";
@@ -83,6 +87,7 @@ private GridClient client(String host) throws GridClientException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNoFailedReconnection() throws Exception {
         for (int i = 0; i < ClientTestRestServer.SERVERS_CNT; i++)
             runServer(i, false);
@@ -140,6 +145,7 @@ public void testNoFailedReconnection() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCorrectInit() throws Exception {
         for (int i = 0; i < ClientTestRestServer.SERVERS_CNT; i++)
             runServer(i, i == 0);
@@ -157,6 +163,7 @@ public void testCorrectInit() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFailedInit() throws Exception {
         for (int i = 0; i < ClientTestRestServer.SERVERS_CNT; i++)
             runServer(i, true);
@@ -184,9 +191,10 @@ public void testFailedInit() throws Exception {
      * @throws Exception If failed.
      */
     @IgniteIgnore(value = "https://issues.apache.org/jira/browse/IGNITE-590", forceFailure = true)
+    @Test
     public void testIdleConnection() throws Exception {
         int srvsCnt = 4; // TODO: IGNITE-590 it may be wrong value. Need to investigate after IGNITE-590 will be fixed.
-        
+
         for (int i = 0; i < srvsCnt; i++)
             runServer(i, false);
 
@@ -235,4 +243,4 @@ private ClientTestRestServer runServer(int idx, boolean  failOnConnect) throws I
 
         return srv;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientSslParametersTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientSslParametersTest.java
new file mode 100644
index 000000000000..c2e10b813555
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientSslParametersTest.java
@@ -0,0 +1,338 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.client;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.ConnectorConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.client.ssl.GridSslBasicContextFactory;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.ssl.SslContextFactory;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests cases when node connects to cluster with different set of cipher suites.
+ */
+@RunWith(JUnit4.class)
+public class ClientSslParametersTest extends GridCommonAbstractTest {
+    /** */
+    public static final String TEST_CACHE_NAME = "TEST";
+
+    /** */
+    private volatile String[] cipherSuites;
+
+    /** */
+    private volatile String[] protocols;
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        cfg.setSslContextFactory(createSslFactory());
+
+        cfg.setConnectorConfiguration(new ConnectorConfiguration()
+            .setSslEnabled(true)
+            .setSslClientAuth(true));
+
+        cfg.setCacheConfiguration(new CacheConfiguration(TEST_CACHE_NAME));
+
+        return cfg;
+    }
+
+    /**
+     * @return Client configuration.
+     */
+    protected GridClientConfiguration getClientConfiguration() {
+        GridClientConfiguration cfg = new GridClientConfiguration();
+
+        cfg.setServers(Collections.singleton("127.0.0.1:11211"));
+
+        cfg.setSslContextFactory(createOldSslFactory());
+
+        return cfg;
+    }
+
+    /**
+     * @return SSL factory.
+     */
+    @NotNull private SslContextFactory createSslFactory() {
+        SslContextFactory factory = (SslContextFactory)GridTestUtils.sslFactory();
+
+        factory.setCipherSuites(cipherSuites);
+
+        factory.setProtocols(protocols);
+
+        return factory;
+    }
+
+    /**
+     * @return SSL Factory.
+     */
+    @NotNull private GridSslBasicContextFactory createOldSslFactory() {
+        GridSslBasicContextFactory factory = (GridSslBasicContextFactory)GridTestUtils.sslContextFactory();
+
+        factory.setCipherSuites(cipherSuites);
+
+        factory.setProtocols(protocols);
+
+        return factory;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        protocols = null;
+
+        cipherSuites = null;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testSameCipherSuite() throws Exception {
+        cipherSuites = new String[] {
+            "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
+        };
+
+        startGrid();
+
+        checkSuccessfulClientStart(
+            new String[] {
+                "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+                "TLS_RSA_WITH_AES_128_GCM_SHA256",
+                "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
+            },
+            null
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testOneCommonCipherSuite() throws Exception {
+        cipherSuites = new String[] {
+            "TLS_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
+        };
+
+        startGrid();
+        
+        checkSuccessfulClientStart(
+            new String[] {
+                "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+                "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
+            },
+            null
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testNoCommonCipherSuite() throws Exception {
+        cipherSuites = new String[] {
+            "TLS_RSA_WITH_AES_128_GCM_SHA256"
+        };
+
+        startGrid();
+        
+        checkClientStartFailure(
+            new String[] {
+                "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+                "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
+            },
+            null
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    @Ignore("https://issues.apache.org/jira/browse/IGNITE-10245")
+    public void testNonExistentCipherSuite() throws Exception {
+        fail("https://issues.apache.org/jira/browse/IGNITE-10245");
+
+        cipherSuites = new String[] {
+            "TLS_RSA_WITH_AES_128_GCM_SHA256"
+        };
+
+        startGrid();
+        
+        checkClientStartFailure(
+            new String[] {
+                "TLC_FAKE_CIPHER",
+                "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
+            },
+            null,
+            "Unsupported ciphersuite"
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testNoCommonProtocols() throws Exception {
+        protocols = new String[] {
+            "TLSv1.1",
+            "SSLv3"
+        };
+
+        startGrid();
+
+        checkClientStartFailure(
+            null,
+            new String[] {
+                "TLSv1",
+                "TLSv1.2"
+            }
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    @Ignore("https://issues.apache.org/jira/browse/IGNITE-10245")
+    public void testNonExistentProtocol() throws Exception {
+        fail("https://issues.apache.org/jira/browse/IGNITE-10245");
+
+        protocols = new String[] {
+            "SSLv3"
+        };
+
+        startGrid();
+
+        checkClientStartFailure(
+            null,
+            new String[] {
+                "SSLv3",
+                "SSLvDoesNotExist"
+            },
+            "SSLvDoesNotExist"
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testSameProtocols() throws Exception {
+        protocols = new String[] {
+            "TLSv1.1",
+            "TLSv1.2"
+        };
+
+        startGrid();
+
+        checkSuccessfulClientStart(
+            null,
+            new String[] {
+                "TLSv1.1",
+                "TLSv1.2"
+            }
+        );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testOneCommonProtocol() throws Exception {
+        protocols = new String[] {
+            "TLSv1",
+            "TLSv1.1",
+            "TLSv1.2"
+        };
+
+        startGrid();
+
+        checkSuccessfulClientStart(
+            null,
+            new String[] {
+                "TLSv1.1",
+                "SSLv3"
+            }
+        );
+    }
+
+    /**
+     * @param cipherSuites list of cipher suites
+     * @param protocols list of protocols
+     * @throws Exception If failed.
+     */
+    private void checkSuccessfulClientStart(String[] cipherSuites, String[] protocols) throws Exception {
+        this.cipherSuites = F.isEmpty(cipherSuites) ? null : cipherSuites;
+        this.protocols = F.isEmpty(protocols) ? null : protocols;
+
+        try (GridClient client = GridClientFactory.start(getClientConfiguration())) {
+            List<GridClientNode> top = client.compute().refreshTopology(false, false);
+
+            assertEquals(1, top.size());
+        }
+    }
+
+    /**
+     * @param cipherSuites list of cipher suites
+     * @param protocols list of protocols
+     */
+    private void checkClientStartFailure(String[] cipherSuites, String[] protocols) {
+        checkClientStartFailure(cipherSuites, protocols, "Latest topology update failed.");
+    }
+
+    /**
+     * @param cipherSuites list of cipher suites
+     * @param protocols list of protocols
+     * @param msg exception message
+     */
+    private void checkClientStartFailure(String[] cipherSuites, String[] protocols, String msg) {
+        this.cipherSuites = F.isEmpty(cipherSuites) ? null : cipherSuites;
+        this.protocols = F.isEmpty(protocols) ? null : protocols;
+
+        GridTestUtils.assertThrows(
+            null,
+            new Callable<Object>() {
+                @Override public Object call() throws Exception {
+                    GridClient client = GridClientFactory.start(getClientConfiguration());
+
+                    client.compute().refreshTopology(false, false);
+
+                    return null;
+                }
+            },
+            GridClientException.class,
+            msg
+        );
+    }
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpSslAuthenticationSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpSslAuthenticationSelfTest.java
index 922526201b19..c43c3c0c4354 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpSslAuthenticationSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpSslAuthenticationSelfTest.java
@@ -32,10 +32,14 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests
  */
+@RunWith(JUnit4.class)
 public class ClientTcpSslAuthenticationSelfTest extends GridCommonAbstractTest {
     /** REST TCP port. */
     private static final int REST_TCP_PORT = 12121;
@@ -112,6 +116,7 @@ private GridClientImpl createClient() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testServerAuthenticated() throws Exception {
         checkServerAuthenticatedByClient(false);
     }
@@ -119,6 +124,7 @@ public void testServerAuthenticated() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testServerNotAuthenticatedByClient() throws Exception {
         try {
             checkServerAuthenticatedByClient(true);
@@ -131,6 +137,7 @@ public void testServerNotAuthenticatedByClient() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClientAuthenticated() throws Exception {
         checkClientAuthenticatedByServer(false);
     }
@@ -138,6 +145,7 @@ public void testClientAuthenticated() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClientNotAuthenticated() throws Exception {
         try {
             checkServerAuthenticatedByClient(true);
@@ -264,4 +272,4 @@ public void reset() {
             srvCheckCallCnt.set(0);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpTaskExecutionAfterTopologyRestartSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpTaskExecutionAfterTopologyRestartSelfTest.java
index 4b63fff1d925..ca7347596bb5 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpTaskExecutionAfterTopologyRestartSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientTcpTaskExecutionAfterTopologyRestartSelfTest.java
@@ -21,10 +21,14 @@
 import org.apache.ignite.configuration.ConnectorConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Ensures
  */
+@RunWith(JUnit4.class)
 public class ClientTcpTaskExecutionAfterTopologyRestartSelfTest extends GridCommonAbstractTest {
     /** Port. */
     private static final int PORT = 11211;
@@ -54,6 +58,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTaskAfterRestart() throws Exception {
         startGrids(1);
 
@@ -72,4 +77,4 @@ public void testTaskAfterRestart() throws Exception {
 
         cli.compute().execute(ClientTcpTask.class.getName(), Collections.singletonList("arg"));
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientCacheFlagsCodecTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientCacheFlagsCodecTest.java
index a9bda0aff145..8d7b4b5c237d 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientCacheFlagsCodecTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientCacheFlagsCodecTest.java
@@ -21,18 +21,20 @@
 import java.util.EnumSet;
 import java.util.Set;
 
-import junit.framework.TestCase;
-
 import org.apache.ignite.internal.client.GridClientCacheFlag;
 import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertTrue;
 
 /**
  * Tests conversions between GridClientCacheFlag.
  */
-public class ClientCacheFlagsCodecTest extends TestCase {
+public class ClientCacheFlagsCodecTest {
     /**
      * Tests that each client flag will be correctly converted to server flag.
      */
+    @Test
     public void testEncodingDecodingFullness() {
         for (GridClientCacheFlag f : GridClientCacheFlag.values()) {
             int bits = GridClientCacheFlag.encodeCacheFlags(EnumSet.of(f));
@@ -48,6 +50,7 @@ public void testEncodingDecodingFullness() {
     /**
      * Tests that groups of client flags can be correctly converted to corresponding server flag groups.
      */
+    @Test
     public void testGroupEncodingDecoding() {
         // All.
         doTestGroup(GridClientCacheFlag.values());
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientComputeImplSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientComputeImplSelfTest.java
index 7777f334f56c..7fd50574883c 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientComputeImplSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientComputeImplSelfTest.java
@@ -24,6 +24,9 @@
 import org.apache.ignite.internal.client.GridClientNode;
 import org.apache.ignite.internal.client.GridClientPredicate;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.testframework.GridTestUtils.assertThrows;
 
@@ -31,6 +34,7 @@
  * Simple unit test for GridClientComputeImpl which checks method parameters.
  * It tests only those methods that can produce assertion underneath upon incorrect arguments.
  */
+@RunWith(JUnit4.class)
 public class ClientComputeImplSelfTest extends GridCommonAbstractTest {
     /** Mocked client compute. */
     private GridClientCompute compute = allocateInstance0(GridClientComputeImpl.class);
@@ -38,6 +42,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testProjection_byGridClientNode() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -49,6 +54,7 @@ public void testProjection_byGridClientNode() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecute() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -60,6 +66,7 @@ public void testExecute() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecuteAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -71,6 +78,7 @@ public void testExecuteAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAffinityExecute() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -82,6 +90,7 @@ public void testAffinityExecute() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAffinityExecuteAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -93,6 +102,7 @@ public void testAffinityExecuteAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNode() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -104,6 +114,7 @@ public void testNode() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNodesByIds() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -115,6 +126,7 @@ public void testNodesByIds() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNodesByFilter() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -126,6 +138,7 @@ public void testNodesByFilter() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRefreshNodeById() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -137,6 +150,7 @@ public void testRefreshNodeById() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRefreshNodeByIdAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -148,6 +162,7 @@ public void testRefreshNodeByIdAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRefreshNodeByIp() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -159,6 +174,7 @@ public void testRefreshNodeByIp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRefreshNodeByIpAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -166,4 +182,4 @@ public void testRefreshNodeByIpAsync() throws Exception {
             }
         }, NullPointerException.class, "Ouch! Argument cannot be null: ip");
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientDataImplSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientDataImplSelfTest.java
index 1638f3123919..61379d136813 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientDataImplSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientDataImplSelfTest.java
@@ -20,12 +20,16 @@
 import java.util.concurrent.Callable;
 import org.apache.ignite.internal.client.GridClientData;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.testframework.GridTestUtils.assertThrows;
 
 /**
  * Simple unit test for GridClientDataImpl which checks method parameters.
  */
+@RunWith(JUnit4.class)
 public class ClientDataImplSelfTest extends GridCommonAbstractTest {
     /** Mocked client data. */
     private GridClientData data = allocateInstance0(GridClientDataImpl.class);
@@ -33,6 +37,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPut() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -54,6 +59,7 @@ public void testPut() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -75,6 +81,7 @@ public void testPutAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutAll() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -88,6 +95,7 @@ public void testPutAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutAllAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -101,6 +109,7 @@ public void testPutAllAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGet() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -112,6 +121,7 @@ public void testGet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -123,6 +133,7 @@ public void testGetAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAll() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -134,6 +145,7 @@ public void testGetAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAllAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -145,6 +157,7 @@ public void testGetAllAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemove() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -158,6 +171,7 @@ public void testRemove() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemoveAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -169,6 +183,7 @@ public void testRemoveAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemoveAll() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -182,6 +197,7 @@ public void testRemoveAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemoveAllAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -195,6 +211,7 @@ public void testRemoveAllAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplace() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -216,6 +233,7 @@ public void testReplace() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplaceAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -233,6 +251,7 @@ public void testReplaceAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCas() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -246,6 +265,7 @@ public void testCas() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCasAsync() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -257,6 +277,7 @@ public void testCasAsync() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAffinity() throws Exception {
         assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -264,4 +285,4 @@ public void testAffinity() throws Exception {
             }
         }, NullPointerException.class, "Ouch! Argument cannot be null: key");
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientFutureAdapterSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientFutureAdapterSelfTest.java
index 67df048d13fe..0d017cff11b5 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientFutureAdapterSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientFutureAdapterSelfTest.java
@@ -24,14 +24,19 @@
 import org.apache.ignite.internal.client.GridClientFuture;
 import org.apache.ignite.internal.client.GridClientFutureTimeoutException;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Grid client future implementation self test.
  */
+@RunWith(JUnit4.class)
 public class ClientFutureAdapterSelfTest extends GridCommonAbstractTest {
     /**
      * Test finished futures.
      */
+    @Test
     public void testFinished() {
         GridClientFutureAdapter<Integer> fut = new GridClientFutureAdapter<>();
 
@@ -50,6 +55,7 @@ public void testFinished() {
      *
      * @throws org.apache.ignite.internal.client.GridClientException On any exception.
      */
+    @Test
     public void testChains() throws GridClientException {
         // Synchronous notifications.
         testChains(1, 100);
@@ -114,4 +120,4 @@ private void testChains(int chainSize, long waitDelay) throws GridClientExceptio
 
         info("Time consumption for " + chainSize + " chained futures: " + (System.currentTimeMillis() - start));
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientPropertiesConfigurationSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientPropertiesConfigurationSelfTest.java
index 55aadfd01b51..964b14e0de01 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientPropertiesConfigurationSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/impl/ClientPropertiesConfigurationSelfTest.java
@@ -39,6 +39,9 @@
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 import org.springframework.context.support.FileSystemXmlApplicationContext;
 
 import static org.apache.ignite.internal.client.GridClientConfiguration.DFLT_MAX_CONN_IDLE_TIME;
@@ -47,6 +50,7 @@
 /**
  * Properties-based configuration self test.
  */
+@RunWith(JUnit4.class)
 public class ClientPropertiesConfigurationSelfTest extends GridCommonAbstractTest {
     /**
      * Grid client spring configuration.
@@ -73,6 +77,7 @@
      *
      * @throws Exception In case of exception.
      */
+    @Test
     public void testCreation() throws Exception {
         // Validate default configuration.
         GridClientConfiguration cfg = new GridClientConfiguration();
@@ -131,6 +136,7 @@ public void testCreation() throws Exception {
      *
      * @throws Exception In case of any exception.
      */
+    @Test
     public void testSpringConfig() throws Exception {
         GridClientConfiguration cfg = new FileSystemXmlApplicationContext(
             GRID_CLIENT_SPRING_CONFIG.toString()).getBean(GridClientConfiguration.class);
@@ -242,4 +248,4 @@ private void validateConfig(int expDataCfgs, GridClientConfiguration cfg) {
         assertEquals(null, cfg.getSslContextFactory(), null);
         assertEquals(DFLT_TOP_REFRESH_FREQ, cfg.getTopologyRefreshFrequency());
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractConnectivitySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractConnectivitySelfTest.java
index 8207ccfb6f15..327c56f95a4b 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractConnectivitySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractConnectivitySelfTest.java
@@ -38,10 +38,14 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests the REST client-server connectivity with various configurations.
  */
+@RunWith(JUnit4.class)
 public abstract class ClientAbstractConnectivitySelfTest extends GridCommonAbstractTest {
     /** */
     private static final String WILDCARD_IP = "0.0.0.0";
@@ -122,6 +126,7 @@ protected GridClient startClient(String addr, int port) throws GridClientExcepti
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testOneNodeDefaultHostAndPort() throws Exception {
         startRestNode("grid1", null, null);
 
@@ -136,6 +141,7 @@ public void testOneNodeDefaultHostAndPort() throws Exception {
      * Simple test of address list filtering.
      * @throws Exception If failed.
      */
+    @Test
     public void testResolveReachableOneAddress() throws Exception {
         InetAddress addr = InetAddress.getByAddress(new byte[] {127, 0, 0, 1} );
 
@@ -151,6 +157,7 @@ public void testResolveReachableOneAddress() throws Exception {
      *
      * @throws Exception If error occurs.
      */
+    @Test
     public void testOneNodeLoopbackHost() throws Exception {
         startRestNode("grid1", LOOPBACK_IP, defaultRestPort());
 
@@ -164,6 +171,7 @@ public void testOneNodeLoopbackHost() throws Exception {
      *
      * @throws Exception If error occurs.
      */
+    @Test
     public void testOneNodeZeroIpv4Address() throws Exception {
         startRestNode("grid1", WILDCARD_IP, defaultRestPort());
 
@@ -208,6 +216,7 @@ public void testOneNodeZeroIpv4Address() throws Exception {
      *
      * @throws Exception If error occurs.
      */
+    @Test
     public void testTwoNodesDefaultHostAndPort() throws Exception {
         startRestNode("grid1", null, null);
         startRestNode("grid2", null, null);
@@ -256,6 +265,7 @@ public void testTwoNodesDefaultHostAndPort() throws Exception {
      *
      * @throws Exception If error occurs.
      */
+    @Test
     public void testRefreshTopologyOnNodeLeft() throws Exception {
         startRestNode("grid1", null, null);
         startRestNode("grid2", null, null);
@@ -323,4 +333,4 @@ private boolean eqAddresses(IgniteBiTuple<Collection<String>, Collection<String>
             return s.matches("\\d+\\.\\d+\\.\\d+\\.\\d+");
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractMultiNodeSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractMultiNodeSelfTest.java
index 3481f34cf17a..077381a20ed9 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractMultiNodeSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractMultiNodeSelfTest.java
@@ -75,6 +75,9 @@
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
@@ -87,7 +90,7 @@
 /**
  * Tests basic client behavior with multiple nodes.
  */
-@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+@RunWith(JUnit4.class)
 public abstract class ClientAbstractMultiNodeSelfTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -255,6 +258,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String cacheName) throws
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testEmptyProjections() throws Exception {
         final GridClientCompute dflt = client.compute();
 
@@ -290,6 +294,7 @@ public void testEmptyProjections() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testProjectionRun() throws Exception {
         GridClientCompute dflt = client.compute();
 
@@ -319,6 +324,7 @@ public void testProjectionRun() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTopologyListener() throws Exception {
         final Collection<UUID> added = new ArrayList<>(1);
         final Collection<UUID> rmvd = new ArrayList<>(1);
@@ -431,7 +437,6 @@ protected GridClientLoadBalancer getBalancer() {
 
             for (int i = 0; i < gridSize; i++) {
                 jobs.add(new ComputeJobAdapter() {
-                    @SuppressWarnings("OverlyStrongTypeCast")
                     @Override public Object execute() {
                         try {
                             Thread.sleep(1000);
@@ -475,7 +480,6 @@ protected GridClientLoadBalancer getBalancer() {
     /**
      * Communication SPI which checks cache flags.
      */
-    @SuppressWarnings("unchecked")
     private static class TestCommunicationSpi extends TcpCommunicationSpi {
         /** {@inheritDoc} */
         @Override public void sendMessage(ClusterNode node, Message msg, IgniteInClosure<IgniteException> ackC)
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractSelfTest.java
index 597121840e70..11a6fe8f9c4e 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientAbstractSelfTest.java
@@ -72,6 +72,9 @@
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_JETTY_PORT;
 import static org.apache.ignite.cache.CacheMode.LOCAL;
@@ -83,6 +86,7 @@
  * Tests for Java client.
  */
 @SuppressWarnings("deprecation")
+@RunWith(JUnit4.class)
 public abstract class ClientAbstractSelfTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -346,6 +350,7 @@ protected GridClientConfiguration clientConfiguration() throws GridClientExcepti
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testConnectable() throws Exception {
         GridClient client = client();
 
@@ -359,6 +364,7 @@ public void testConnectable() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testNoAsyncExceptions() throws Exception {
         GridClient client = client();
 
@@ -404,6 +410,7 @@ public void testNoAsyncExceptions() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGracefulShutdown() throws Exception {
         GridClientCompute compute = client.compute();
 
@@ -422,6 +429,7 @@ public void testGracefulShutdown() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testForceShutdown() throws Exception {
         GridClientCompute compute = client.compute();
 
@@ -445,6 +453,7 @@ public void testForceShutdown() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShutdown() throws Exception {
         GridClient c = client();
 
@@ -486,6 +495,7 @@ public void testShutdown() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecute() throws Exception {
         String taskName = getTaskName();
         Object taskArg = getTaskArgument();
@@ -499,6 +509,7 @@ public void testExecute() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTopology() throws Exception {
         GridClientCompute compute = client.compute();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientPreferDirectSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientPreferDirectSelfTest.java
index b012d3b85fe6..e99d93dacd82 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientPreferDirectSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/integration/ClientPreferDirectSelfTest.java
@@ -40,6 +40,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.internal.client.integration.ClientAbstractMultiNodeSelfTest.HOST;
 import static org.apache.ignite.internal.client.integration.ClientAbstractMultiNodeSelfTest.REST_TCP_PORT_BASE;
@@ -48,6 +51,7 @@
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class ClientPreferDirectSelfTest extends GridCommonAbstractTest {
     /** VM ip finder for TCP discovery. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -86,6 +90,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRandomBalancer() throws Exception {
         GridClientRandomBalancer b = new GridClientRandomBalancer();
 
@@ -97,6 +102,7 @@ public void testRandomBalancer() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRoundRobinBalancer() throws Exception {
         GridClientRoundRobinBalancer b = new GridClientRoundRobinBalancer();
 
@@ -195,4 +201,4 @@ private GridClient client(GridClientLoadBalancer b) throws Exception {
             return ignite.cluster().localNode().id().toString();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/ClientFailedInitSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/ClientFailedInitSelfTest.java
index 971dcb186b15..86fc9a6e5257 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/ClientFailedInitSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/ClientFailedInitSelfTest.java
@@ -42,6 +42,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_JETTY_PORT;
 import static org.apache.ignite.internal.client.GridClientProtocol.TCP;
@@ -53,6 +56,7 @@
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class ClientFailedInitSelfTest extends GridCommonAbstractTest {
     /** */
     private static final int RECONN_CNT = 3;
@@ -103,6 +107,7 @@
     /**
      *
      */
+    @Test
     public void testEmptyAddresses() {
         try {
             GridClientFactory.start(new GridClientConfiguration());
@@ -117,6 +122,7 @@ public void testEmptyAddresses() {
     /**
      *
      */
+    @Test
     public void testRoutersAndServersAddressesProvided() {
         try {
             GridClientConfiguration c = new GridClientConfiguration();
@@ -136,6 +142,7 @@ public void testRoutersAndServersAddressesProvided() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTcpClient() throws Exception {
         doTestClient(TCP);
     }
@@ -143,6 +150,7 @@ public void testTcpClient() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTcpRouter() throws Exception {
         doTestRouter(TCP);
     }
@@ -288,4 +296,4 @@ private GridClient client(GridClientProtocol p, boolean useRouter) throws GridCl
             return results.get(0).getData();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
index 5df424c4cabc..09ff38086a76 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
@@ -27,12 +27,16 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_JETTY_PORT;
 
 /**
  * Test routers factory.
  */
+@RunWith(JUnit4.class)
 public class RouterFactorySelfTest extends GridCommonAbstractTest {
     /** Shared IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -59,6 +63,7 @@
      *
      * @throws Exception In case of any exception.
      */
+    @Test
     public void testRouterFactory() throws Exception {
         try {
             System.setProperty(IGNITE_JETTY_PORT, String.valueOf(GRID_HTTP_PORT));
@@ -109,4 +114,4 @@ public void testRouterFactory() throws Exception {
             stopAllGrids();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpRouterAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpRouterAbstractSelfTest.java
index 628006ebfa2a..c3ae3d2671aa 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpRouterAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpRouterAbstractSelfTest.java
@@ -29,10 +29,14 @@
 import org.apache.ignite.internal.client.router.impl.GridTcpRouterImpl;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.logger.log4j.Log4JLogger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Abstract base class for http routing tests.
  */
+@RunWith(JUnit4.class)
 public abstract class TcpRouterAbstractSelfTest extends ClientAbstractSelfTest {
     /** Port number to use by router. */
     private static final int ROUTER_PORT = BINARY_PORT + 1;
@@ -117,6 +121,7 @@ public GridTcpRouterConfiguration routerConfiguration() throws IgniteCheckedExce
     /**
      * @throws Exception If failed.
      */
+    @Test
     @Override public void testConnectable() throws Exception {
         GridClient client = client();
 
@@ -124,4 +129,4 @@ public GridTcpRouterConfiguration routerConfiguration() throws IgniteCheckedExce
 
         assertFalse(F.first(nodes).connectable());
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpSslRouterSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpSslRouterSelfTest.java
index 3b47ae5ca9d8..3e710f08796a 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpSslRouterSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/TcpSslRouterSelfTest.java
@@ -20,12 +20,12 @@
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.client.ssl.GridSslContextFactory;
 import org.apache.ignite.testframework.GridTestUtils;
-import org.apache.ignite.testsuites.IgniteIgnore;
+import org.junit.Ignore;
 
 /**
  *
  */
-@IgniteIgnore(value = "https://issues.apache.org/jira/browse/IGNITE-433", forceFailure = true)
+@Ignore(value = "https://issues.apache.org/jira/browse/IGNITE-433")
 public class TcpSslRouterSelfTest extends TcpRouterAbstractSelfTest {
     /** {@inheritDoc} */
     @Override protected boolean useSsl() {
@@ -47,4 +47,4 @@
 
         return cfg;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/suite/IgniteClientTestSuite.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/suite/IgniteClientTestSuite.java
index 657fda4a8017..ae8ab987608d 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/suite/IgniteClientTestSuite.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/suite/IgniteClientTestSuite.java
@@ -17,10 +17,12 @@
 
 package org.apache.ignite.internal.client.suite;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.internal.TaskEventSubjectIdSelfTest;
 import org.apache.ignite.internal.client.ClientDefaultCacheSelfTest;
 import org.apache.ignite.internal.client.ClientReconnectionSelfTest;
+import org.apache.ignite.internal.client.ClientSslParametersTest;
 import org.apache.ignite.internal.client.ClientTcpMultiThreadedSelfTest;
 import org.apache.ignite.internal.client.ClientTcpSslAuthenticationSelfTest;
 import org.apache.ignite.internal.client.ClientTcpSslMultiThreadedSelfTest;
@@ -53,6 +55,7 @@
 import org.apache.ignite.internal.processors.rest.ClientMemcachedProtocolSelfTest;
 import org.apache.ignite.internal.processors.rest.JettyRestProcessorAuthenticationWithCredsSelfTest;
 import org.apache.ignite.internal.processors.rest.JettyRestProcessorAuthenticationWithTokenSelfTest;
+import org.apache.ignite.internal.processors.rest.JettyRestProcessorBaselineSelfTest;
 import org.apache.ignite.internal.processors.rest.JettyRestProcessorGetAllAsArrayTest;
 import org.apache.ignite.internal.processors.rest.JettyRestProcessorSignedSelfTest;
 import org.apache.ignite.internal.processors.rest.JettyRestProcessorUnsignedSelfTest;
@@ -79,91 +82,95 @@
     public static TestSuite suite() {
         TestSuite suite = new IgniteTestSuite("Ignite Clients Test Suite");
 
-        suite.addTestSuite(RouterFactorySelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(RouterFactorySelfTest.class));
 
         // Parser standalone test.
-        suite.addTestSuite(TcpRestParserSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(TcpRestParserSelfTest.class));
 
         // Test memcache protocol with custom test client.
-        suite.addTestSuite(RestMemcacheProtocolSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(RestMemcacheProtocolSelfTest.class));
 
         // Test custom binary protocol with test client.
-        suite.addTestSuite(RestBinaryProtocolSelfTest.class);
-        suite.addTestSuite(TcpRestUnmarshalVulnerabilityTest.class);
+            suite.addTest(new JUnit4TestAdapter(RestBinaryProtocolSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(TcpRestUnmarshalVulnerabilityTest.class));
 
         // Test jetty rest processor
-        suite.addTestSuite(JettyRestProcessorSignedSelfTest.class);
-        suite.addTestSuite(JettyRestProcessorUnsignedSelfTest.class);
-        suite.addTestSuite(JettyRestProcessorAuthenticationWithCredsSelfTest.class);
-        suite.addTestSuite(JettyRestProcessorAuthenticationWithTokenSelfTest.class);
-        suite.addTestSuite(JettyRestProcessorGetAllAsArrayTest.class);
+            suite.addTest(new JUnit4TestAdapter(JettyRestProcessorSignedSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(JettyRestProcessorUnsignedSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(JettyRestProcessorAuthenticationWithCredsSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(JettyRestProcessorAuthenticationWithTokenSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(JettyRestProcessorGetAllAsArrayTest.class));
+            suite.addTest(new JUnit4TestAdapter(JettyRestProcessorBaselineSelfTest.class));
 
         // Test TCP rest processor with original memcache client.
-        suite.addTestSuite(ClientMemcachedProtocolSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientMemcachedProtocolSelfTest.class));
 
         // Test TCP rest processor with original REDIS client.
-        suite.addTestSuite(RedisProtocolStringSelfTest.class);
-        suite.addTestSuite(RedisProtocolGetAllAsArrayTest.class);
-        suite.addTestSuite(RedisProtocolConnectSelfTest.class);
-        suite.addTestSuite(RedisProtocolServerSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(RedisProtocolStringSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(RedisProtocolGetAllAsArrayTest.class));
+            suite.addTest(new JUnit4TestAdapter(RedisProtocolConnectSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(RedisProtocolServerSelfTest.class));
 
-        suite.addTestSuite(RestProcessorStartSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(RestProcessorStartSelfTest.class));
 
         // Test cache flag conversion.
-        suite.addTestSuite(ClientCacheFlagsCodecTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientCacheFlagsCodecTest.class));
 
         // Test multi-start.
-        suite.addTestSuite(RestProcessorMultiStartSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(RestProcessorMultiStartSelfTest.class));
 
         // Test clients.
-        suite.addTestSuite(ClientDataImplSelfTest.class);
-        suite.addTestSuite(ClientComputeImplSelfTest.class);
-        suite.addTestSuite(ClientTcpSelfTest.class);
-        suite.addTestSuite(ClientTcpDirectSelfTest.class);
-        suite.addTestSuite(ClientTcpSslSelfTest.class);
-        suite.addTestSuite(ClientTcpSslDirectSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientDataImplSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientComputeImplSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpDirectSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSslSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSslDirectSelfTest.class));
 
         // Test client with many nodes.
-        suite.addTestSuite(ClientTcpMultiNodeSelfTest.class);
-        suite.addTestSuite(ClientTcpDirectMultiNodeSelfTest.class);
-        suite.addTestSuite(ClientTcpSslMultiNodeSelfTest.class);
-        suite.addTestSuite(ClientTcpSslDirectMultiNodeSelfTest.class);
-        suite.addTestSuite(ClientTcpUnreachableMultiNodeSelfTest.class);
-        suite.addTestSuite(ClientPreferDirectSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientTcpMultiNodeSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpDirectMultiNodeSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSslMultiNodeSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSslDirectMultiNodeSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpUnreachableMultiNodeSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientPreferDirectSelfTest.class));
 
         // Test client with many nodes and in multithreaded scenarios
-        suite.addTestSuite(ClientTcpMultiThreadedSelfTest.class);
-        suite.addTestSuite(ClientTcpSslMultiThreadedSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientTcpMultiThreadedSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSslMultiThreadedSelfTest.class));
 
         // Test client authentication.
-        suite.addTestSuite(ClientTcpSslAuthenticationSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientTcpSslAuthenticationSelfTest.class));
 
-        suite.addTestSuite(ClientTcpConnectivitySelfTest.class);
-        suite.addTestSuite(ClientReconnectionSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientTcpConnectivitySelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientReconnectionSelfTest.class));
 
         // Rest task command handler test.
-        suite.addTestSuite(TaskCommandHandlerSelfTest.class);
-        suite.addTestSuite(ChangeStateCommandHandlerTest.class);
-        suite.addTestSuite(TaskEventSubjectIdSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(TaskCommandHandlerSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ChangeStateCommandHandlerTest.class));
+            suite.addTest(new JUnit4TestAdapter(TaskEventSubjectIdSelfTest.class));
 
         // Default cache only test.
-        suite.addTestSuite(ClientDefaultCacheSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientDefaultCacheSelfTest.class));
 
-        suite.addTestSuite(ClientFutureAdapterSelfTest.class);
-        suite.addTestSuite(ClientPropertiesConfigurationSelfTest.class);
-        suite.addTestSuite(ClientConsistentHashSelfTest.class);
-        suite.addTestSuite(ClientJavaHasherSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientFutureAdapterSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientPropertiesConfigurationSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientConsistentHashSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(ClientJavaHasherSelfTest.class));
 
-        suite.addTestSuite(ClientByteUtilsTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientByteUtilsTest.class));
 
         // Router tests.
-        suite.addTestSuite(TcpRouterSelfTest.class);
-        suite.addTestSuite(TcpSslRouterSelfTest.class);
-        suite.addTestSuite(TcpRouterMultiNodeSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(TcpRouterSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(TcpSslRouterSelfTest.class));
+            suite.addTest(new JUnit4TestAdapter(TcpRouterMultiNodeSelfTest.class));
 
-        suite.addTestSuite(ClientFailedInitSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientFailedInitSelfTest.class));
 
-        suite.addTestSuite(ClientTcpTaskExecutionAfterTopologyRestartSelfTest.class);
+            suite.addTest(new JUnit4TestAdapter(ClientTcpTaskExecutionAfterTopologyRestartSelfTest.class));
+
+        // SSL params.
+            suite.addTest(new JUnit4TestAdapter(ClientSslParametersTest.class));
 
         return suite;
     }
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientByteUtilsTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientByteUtilsTest.java
index 72112cb8e6fd..93aa8cd17b31 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientByteUtilsTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientByteUtilsTest.java
@@ -25,6 +25,9 @@
 import org.apache.ignite.internal.util.GridClientByteUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.internal.util.GridClientByteUtils.bytesToInt;
 import static org.apache.ignite.internal.util.GridClientByteUtils.bytesToLong;
@@ -36,12 +39,14 @@
 /**
  * Test case for client's byte convertion utility.
  */
+@RunWith(JUnit4.class)
 public class ClientByteUtilsTest extends GridCommonAbstractTest {
     /**
      * Test UUID conversions from string to binary and back.
      *
      * @throws Exception On any exception.
      */
+    @Test
     public void testUuidConvertions() throws Exception {
         Map<String, byte[]> map = new LinkedHashMap<>();
 
@@ -92,6 +97,7 @@ public void testUuidConvertions() throws Exception {
         }
     }
 
+    @Test
     public void testShortToBytes() throws Exception {
         Map<String, Short> map = new HashMap<>();
 
@@ -116,6 +122,7 @@ public void testShortToBytes() throws Exception {
         }
     }
 
+    @Test
     public void testIntToBytes() throws Exception {
         Map<String, Integer> map = new HashMap<>();
 
@@ -140,6 +147,7 @@ public void testIntToBytes() throws Exception {
         }
     }
 
+    @Test
     public void testLongToBytes() throws Exception {
         Map<String, Long> map = new LinkedHashMap<>();
 
@@ -177,4 +185,4 @@ public void testLongToBytes() throws Exception {
 
         return b;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientConsistentHashSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientConsistentHashSelfTest.java
index fa9d4b49a4d8..b0c7217c7251 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientConsistentHashSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientConsistentHashSelfTest.java
@@ -31,10 +31,14 @@
 import java.util.TreeSet;
 import java.util.UUID;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test for consistent hash management class.
  */
+@RunWith(JUnit4.class)
 public class ClientConsistentHashSelfTest extends GridCommonAbstractTest {
     /** Replicas count. */
     private static final int REPLICAS = 512;
@@ -44,6 +48,7 @@
      *
      * @throws Exception In case of any exception.
      */
+    @Test
     public void testCollisions() throws Exception {
         Map<Integer, Set<UUID>> map = new HashMap<>();
 
@@ -95,6 +100,7 @@ public void testCollisions() throws Exception {
      *
      * @throws Exception In case of any exception.
      */
+    @Test
     public void testTreeSetRestrictions() throws Exception {
         // Constructs hash without explicit node's comparator.
         GridClientConsistentHash<Object> hash = new GridClientConsistentHash<>();
@@ -129,6 +135,7 @@ public void testTreeSetRestrictions() throws Exception {
      * Validate generated hashes.<p>
      * Note! This test should be ported into all supported platforms.
      */
+    @Test
     public void testHashGeneraton() {
         // Validate strings.
         checkHash("", -1484017934);
@@ -167,7 +174,7 @@ public void testHashGeneraton() {
     /**
      * Test mapping to nodes.
      */
-    @SuppressWarnings("UnaryPlus")
+    @Test
     public void testMappingToNodes() {
         String n1 = "node #1";
         String n2 = "node #2";
@@ -289,4 +296,4 @@ private void checkHash(Object o, int code) {
 
         assertEquals("Check affinity for object: " + o, code, i);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientJavaHasherSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientJavaHasherSelfTest.java
index 765c58d88eec..432cd895ae43 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientJavaHasherSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/util/ClientJavaHasherSelfTest.java
@@ -21,14 +21,19 @@
 import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test for Java hash codes calculations - SHOULD BE PORTED to other languages.
  */
+@RunWith(JUnit4.class)
 public class ClientJavaHasherSelfTest extends GridCommonAbstractTest {
     /**
      * Validate known Java hash codes.
      */
+    @Test
     public void testPredefined() {
         Map<Object, Integer> map = new LinkedHashMap<>();
 
@@ -82,4 +87,4 @@ public void testPredefined() {
 
         fail("Java hash codes validation fails.");
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBlobTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBlobTest.java
index 9e0e0d2f6aab..a8267aa23851 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBlobTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBlobTest.java
@@ -21,15 +21,20 @@
 import java.io.InputStream;
 import java.sql.SQLException;
 import java.util.Arrays;
-import junit.framework.TestCase;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
 
 /**
  *
  */
-public class JdbcBlobTest extends TestCase {
+public class JdbcBlobTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLength() throws Exception {
         JdbcBlob blob = new JdbcBlob(new byte[16]);
 
@@ -50,6 +55,7 @@ public void testLength() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetBytes() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
@@ -124,6 +130,7 @@ public void testGetBytes() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetBinaryStream() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
@@ -150,6 +157,7 @@ public void testGetBinaryStream() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetBinaryStreamWithParams() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
@@ -222,6 +230,7 @@ public void testGetBinaryStreamWithParams() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPositionBytePattern() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
@@ -256,6 +265,7 @@ public void testPositionBytePattern() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPositionBlobPattern() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
@@ -290,6 +300,7 @@ public void testPositionBlobPattern() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetBytes() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7};
 
@@ -341,6 +352,7 @@ public void testSetBytes() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetBytesWithOffsetAndLength() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7};
 
@@ -419,6 +431,7 @@ public void testSetBytesWithOffsetAndLength() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTruncate() throws Exception {
         byte[] arr = new byte[] {0, 1, 2, 3, 4, 5, 6, 7};
 
@@ -482,4 +495,4 @@ public void testTruncate() throws Exception {
 
         return res;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBulkLoadSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBulkLoadSelfTest.java
index 753a98c9cc77..df12cbec784f 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBulkLoadSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBulkLoadSelfTest.java
@@ -37,12 +37,16 @@
 import java.util.Collections;
 import java.util.Properties;
 import java.util.concurrent.Callable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
 
 /** COPY command test for the regular JDBC driver. */
+@RunWith(JUnit4.class)
 public class JdbcBulkLoadSelfTest extends GridCommonAbstractTest {
     /** JDBC URL. */
     private static final String BASE_URL = CFG_URL_PREFIX +
@@ -124,6 +128,7 @@ private Connection createConnection() throws Exception {
      *
      * @throws Exception if failed.
      */
+    @Test
     public void testBulkLoadThrows() throws Exception {
         GridTestUtils.assertThrows(null, new Callable<Object>() {
             @Override public Object call() throws Exception {
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcComplexQuerySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcComplexQuerySelfTest.java
index 8b1390e2c58d..56b0ab217da6 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcComplexQuerySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcComplexQuerySelfTest.java
@@ -33,6 +33,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
@@ -42,6 +45,7 @@
 /**
  * Tests for complex queries (joins, etc.).
  */
+@RunWith(JUnit4.class)
 public class JdbcComplexQuerySelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -131,6 +135,7 @@ protected CacheConfiguration cacheConfiguration(@NotNull String name, Class<?> c
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoin() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name as orgName from \"pers\".Person p, \"org\".Organization o where p.orgId = o.id");
@@ -166,6 +171,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoinWithoutAlias() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name from \"pers\".Person p, \"org\".Organization o where p.orgId = o.id");
@@ -204,6 +210,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIn() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from \"pers\".Person where age in (25, 35)");
 
@@ -224,6 +231,7 @@ public void testIn() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBetween() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from \"pers\".Person where age between 24 and 36");
 
@@ -244,6 +252,7 @@ public void testBetween() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCalculatedValue() throws Exception {
         ResultSet rs = stmt.executeQuery("select age * 2 from \"pers\".Person");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionReopenTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionReopenTest.java
index 531b4e52352f..554626b05946 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionReopenTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionReopenTest.java
@@ -22,12 +22,16 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.IgnitionEx;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 
 /**
  * Connection test.
  */
+@RunWith(JUnit4.class)
 public class JdbcConnectionReopenTest extends GridCommonAbstractTest {
     /**
      * @return Config URL to use in test.
@@ -39,6 +43,7 @@ private String configURL() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReopenSameInstanceName() throws Exception {
         String url = CFG_URL_PREFIX + configURL();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java
index d560d74a2c89..0fb66bc76d10 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java
@@ -31,12 +31,16 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 
 /**
  * Connection test.
  */
+@RunWith(JUnit4.class)
 public class JdbcConnectionSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -100,6 +104,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDefaults() throws Exception {
         String url = CFG_URL_PREFIX + configURL();
 
@@ -117,6 +122,7 @@ public void testDefaults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNodeId() throws Exception {
         String url = CFG_URL_PREFIX + "nodeId=" + grid(0).localNode().id() + '@' + configURL();
 
@@ -134,6 +140,7 @@ public void testNodeId() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testWrongNodeId() throws Exception {
         UUID wrongId = UUID.randomUUID();
 
@@ -156,6 +163,7 @@ public void testWrongNodeId() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClientNodeId() throws Exception {
         client = true;
 
@@ -182,6 +190,7 @@ public void testClientNodeId() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDaemonNodeId() throws Exception {
         daemon = true;
 
@@ -208,6 +217,7 @@ public void testDaemonNodeId() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCustomCache() throws Exception {
         String url = CFG_URL_PREFIX + "cache=" + CUSTOM_CACHE_NAME + '@' + configURL();
 
@@ -219,6 +229,7 @@ public void testCustomCache() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testWrongCache() throws Exception {
         final String url = CFG_URL_PREFIX + "cache=wrongCacheName@" + configURL();
 
@@ -239,6 +250,7 @@ public void testWrongCache() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClose() throws Exception {
         String url = CFG_URL_PREFIX + configURL();
 
@@ -268,6 +280,7 @@ public void testClose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTxAllowedCommit() throws Exception {
         String url = CFG_URL_PREFIX + "transactionsAllowed=true@" + configURL();
 
@@ -285,6 +298,7 @@ public void testTxAllowedCommit() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTxAllowedRollback() throws Exception {
         String url = CFG_URL_PREFIX + "transactionsAllowed=true@" + configURL();
 
@@ -302,6 +316,7 @@ public void testTxAllowedRollback() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlHints() throws Exception {
         try (final Connection conn = DriverManager.getConnection(CFG_URL_PREFIX + "enforceJoinOrder=true@"
             + configURL())) {
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDeleteStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDeleteStatementSelfTest.java
index 3eec5a025d94..5652fb117736 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDeleteStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDeleteStatementSelfTest.java
@@ -21,14 +21,19 @@
 import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.HashSet;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcDeleteStatementSelfTest extends JdbcAbstractUpdateStatementSelfTest {
     /**
      *
      */
+    @Test
     public void testExecute() throws SQLException {
         conn.createStatement().execute("delete from Person where cast(substring(_key, 2, 1) as int) % 2 = 0");
 
@@ -39,6 +44,7 @@ public void testExecute() throws SQLException {
     /**
      *
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         int res =
             conn.createStatement().executeUpdate("delete from Person where cast(substring(_key, 2, 1) as int) % 2 = 0");
@@ -51,6 +57,7 @@ public void testExecuteUpdate() throws SQLException {
     /**
      *
      */
+    @Test
     public void testBatch() throws SQLException {
         PreparedStatement ps = conn.prepareStatement("delete from Person where firstName = ?");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDistributedJoinsQueryTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDistributedJoinsQueryTest.java
index 2a58e0280676..aa2e93814673 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDistributedJoinsQueryTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDistributedJoinsQueryTest.java
@@ -31,6 +31,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
@@ -40,6 +43,7 @@
 /**
  * Tests for complex queries with distributed joins enabled (joins, etc.).
  */
+@RunWith(JUnit4.class)
 public class JdbcDistributedJoinsQueryTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -116,6 +120,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoin() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name as orgName from Person p, Organization o where p.orgId = o.id");
@@ -151,6 +156,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoinWithoutAlias() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name from Person p, Organization o where p.orgId = o.id");
@@ -189,6 +195,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIn() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from Person where age in (25, 35)");
 
@@ -209,6 +216,7 @@ public void testIn() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBetween() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from Person where age between 24 and 36");
 
@@ -229,6 +237,7 @@ public void testBetween() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCalculatedValue() throws Exception {
         ResultSet rs = stmt.executeQuery("select age * 2 from Person");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java
index 9485d0d54212..0ffc073d5cd5 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java
@@ -31,10 +31,14 @@
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test that checks indexes handling with JDBC.
  */
+@RunWith(JUnit4.class)
 public abstract class JdbcDynamicIndexAbstractSelfTest extends JdbcAbstractDmlStatementSelfTest {
     /** */
     private final static String CREATE_INDEX = "create index idx on Person (id desc)";
@@ -136,6 +140,7 @@ private Object getSingleValue(ResultSet rs) throws SQLException {
     /**
      * Test that after index creation index is used by queries.
      */
+    @Test
     public void testCreateIndex() throws SQLException {
         assertSize(3);
 
@@ -165,6 +170,7 @@ public void testCreateIndex() throws SQLException {
     /**
      * Test that creating an index with duplicate name yields an error.
      */
+    @Test
     public void testCreateIndexWithDuplicateName() throws SQLException {
         jdbcRun(CREATE_INDEX);
 
@@ -179,6 +185,7 @@ public void testCreateIndexWithDuplicateName() throws SQLException {
     /**
      * Test that creating an index with duplicate name does not yield an error with {@code IF NOT EXISTS}.
      */
+    @Test
     public void testCreateIndexIfNotExists() throws SQLException {
         jdbcRun(CREATE_INDEX);
 
@@ -189,6 +196,7 @@ public void testCreateIndexIfNotExists() throws SQLException {
     /**
      * Test that after index drop there are no attempts to use it, and data state remains intact.
      */
+    @Test
     public void testDropIndex() throws SQLException {
         assertSize(3);
 
@@ -218,6 +226,7 @@ public void testDropIndex() throws SQLException {
     /**
      * Test that dropping a non-existent index yields an error.
      */
+    @Test
     public void testDropMissingIndex() {
         assertSqlException(new RunnableX() {
             /** {@inheritDoc} */
@@ -230,6 +239,7 @@ public void testDropMissingIndex() {
     /**
      * Test that dropping a non-existent index does not yield an error with {@code IF EXISTS}.
      */
+    @Test
     public void testDropMissingIndexIfExists() throws SQLException {
         // Despite index missing, this does not yield an error.
         jdbcRun(DROP_INDEX_IF_EXISTS);
@@ -238,6 +248,7 @@ public void testDropMissingIndexIfExists() throws SQLException {
     /**
      * Test that changes in cache affect index, and vice versa.
      */
+    @Test
     public void testIndexState() throws SQLException {
         IgniteCache<String, Person> cache = cache();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcEmptyCacheSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcEmptyCacheSelfTest.java
index 25b97ea1c17c..13c4df32d7ec 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcEmptyCacheSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcEmptyCacheSelfTest.java
@@ -24,6 +24,9 @@
 import org.apache.ignite.testframework.junits.common.*;
 
 import java.sql.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.*;
 import static org.apache.ignite.cache.CacheMode.*;
@@ -32,6 +35,7 @@
 /**
  * Tests for empty cache.
  */
+@RunWith(JUnit4.class)
 public class JdbcEmptyCacheSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -99,6 +103,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelectNumber() throws Exception {
         ResultSet rs = stmt.executeQuery("select 1");
 
@@ -117,6 +122,7 @@ public void testSelectNumber() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelectString() throws Exception {
         ResultSet rs = stmt.executeQuery("select 'str'");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcErrorsSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcErrorsSelfTest.java
index 63f0c84a67f7..a701b9151467 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcErrorsSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcErrorsSelfTest.java
@@ -22,10 +22,14 @@
 import java.sql.SQLException;
 import org.apache.ignite.jdbc.JdbcErrorsAbstractSelfTest;
 import org.apache.ignite.lang.IgniteCallable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test SQLSTATE codes propagation with thin client driver.
  */
+@RunWith(JUnit4.class)
 public class JdbcErrorsSelfTest extends JdbcErrorsAbstractSelfTest {
     /** Path to JDBC configuration for node that is to start. */
     private static final String CFG_PATH = "modules/clients/src/test/config/jdbc-config.xml";
@@ -40,6 +44,7 @@
      * due to <b>communication problems</b> (not due to clear misconfiguration).
      * @throws SQLException if failed.
      */
+    @Test
     public void testConnectionError() throws SQLException {
         final String path = "jdbc:ignite:сfg://cache=test@/unknown/path";
 
@@ -56,6 +61,7 @@ public void testConnectionError() throws SQLException {
      * Test error code for the case when connection string is a mess.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidConnectionStringFormat() throws SQLException {
         final String cfgPath = "cache=";
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
index 44a45b7323b4..70c1d2df1e52 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
@@ -29,10 +29,14 @@
 import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcInsertStatementSelfTest extends JdbcAbstractDmlStatementSelfTest {
     /** SQL query. */
     private static final String SQL = "insert into Person(_key, id, firstName, lastName, age, data) values " +
@@ -136,6 +140,7 @@
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         int res = stmt.executeUpdate(SQL);
 
@@ -145,6 +150,7 @@ public void testExecuteUpdate() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         boolean res = stmt.execute(SQL);
 
@@ -154,6 +160,7 @@ public void testExecute() throws SQLException {
     /**
      *
      */
+    @Test
     public void testDuplicateKeys() {
         jcache(0).put("p2", new Person(2, "Joe", "Black", 35));
 
@@ -177,6 +184,7 @@ public void testDuplicateKeys() {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testBatch() throws SQLException {
         formBatch(1, 2);
         formBatch(3, 4);
@@ -189,6 +197,7 @@ public void testBatch() throws SQLException {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testSingleItemBatch() throws SQLException {
         formBatch(1, 2);
 
@@ -200,6 +209,7 @@ public void testSingleItemBatch() throws SQLException {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testSingleItemBatchError() throws SQLException {
         formBatch(1, 2);
 
@@ -223,6 +233,7 @@ public void testSingleItemBatchError() throws SQLException {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testErrorAmidstBatch() throws SQLException {
         formBatch(1, 2);
         formBatch(3, 1); // Duplicate key
@@ -248,6 +259,7 @@ public void testErrorAmidstBatch() throws SQLException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClearBatch() throws Exception {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws SQLException {
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcLocalCachesSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcLocalCachesSelfTest.java
index 46379cba70b8..56ebb90630b8 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcLocalCachesSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcLocalCachesSelfTest.java
@@ -29,6 +29,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.IgniteJdbcDriver.PROP_NODE_ID;
@@ -38,6 +41,7 @@
 /**
  * Test JDBC with several local caches.
  */
+@RunWith(JUnit4.class)
 public class JdbcLocalCachesSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -98,6 +102,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCache1() throws Exception {
         Properties cfg = new Properties();
 
@@ -129,6 +134,7 @@ public void testCache1() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testCountAll() throws Exception {
         Properties cfg = new Properties();
 
@@ -154,6 +160,7 @@ public void testCountAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCache2() throws Exception {
         Properties cfg = new Properties();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMergeStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMergeStatementSelfTest.java
index 489bacd8ea90..b9fc04ec2442 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMergeStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMergeStatementSelfTest.java
@@ -23,10 +23,14 @@
 import java.sql.Statement;
 import java.util.Arrays;
 import org.apache.ignite.cache.CachePeekMode;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * MERGE statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcMergeStatementSelfTest extends JdbcAbstractDmlStatementSelfTest {
     /** SQL query. */
     private static final String SQL = "merge into Person(_key, id, firstName, lastName, age, data) values " +
@@ -130,6 +134,7 @@
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         int res = stmt.executeUpdate(SQL);
 
@@ -139,6 +144,7 @@ public void testExecuteUpdate() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         boolean res = stmt.execute(SQL);
 
@@ -148,6 +154,7 @@ public void testExecute() throws SQLException {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testBatch() throws SQLException {
         prepStmt.setString(1, "p1");
         prepStmt.setInt(2, 1);
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
index c3d0824ff123..f52c5ee4541f 100755
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
@@ -49,6 +49,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Types.INTEGER;
 import static java.sql.Types.VARCHAR;
@@ -60,6 +63,7 @@
 /**
  * Metadata tests.
  */
+@RunWith(JUnit4.class)
 public class JdbcMetadataSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -137,6 +141,7 @@ protected CacheConfiguration cacheConfiguration(@NotNull String name) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testResultSetMetaData() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             Statement stmt = conn.createStatement();
@@ -171,6 +176,7 @@ public void testResultSetMetaData() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetTables() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -207,6 +213,7 @@ public void testGetTables() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetColumns() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -295,6 +302,7 @@ public void testGetColumns() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetadataResultSetClose() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL);
              ResultSet tbls = conn.getMetaData().getTables(null, null, "%", null)) {
@@ -313,6 +321,7 @@ public void testMetadataResultSetClose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIndexMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL);
              ResultSet rs = conn.getMetaData().getIndexInfo(null, "pers", "PERSON", false, false)) {
@@ -351,6 +360,7 @@ else if ("AGE".equals(field))
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrimaryKeyMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL);
              ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "PERSON")) {
@@ -370,6 +380,7 @@ public void testPrimaryKeyMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testParametersMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             conn.setSchema("pers");
@@ -394,6 +405,7 @@ public void testParametersMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSchemasMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             ResultSet rs = conn.getMetaData().getSchemas();
@@ -415,6 +427,7 @@ public void testSchemasMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testVersions() throws Exception {
         try (Connection conn = DriverManager.getConnection(BASE_URL)) {
             assertEquals("Apache Ignite", conn.getMetaData().getDatabaseProductName());
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoCacheStreamingSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoCacheStreamingSelfTest.java
index e32e07036bb0..e3bdfec4dded 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoCacheStreamingSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoCacheStreamingSelfTest.java
@@ -31,6 +31,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -39,6 +42,7 @@
 /**
  * Data streaming test for thick driver and no explicit caches.
  */
+@RunWith(JUnit4.class)
 public class JdbcNoCacheStreamingSelfTest extends GridCommonAbstractTest {
     /** JDBC URL. */
     private static final String BASE_URL = CFG_URL_PREFIX +
@@ -123,6 +127,7 @@ protected Connection createConnection(boolean allowOverwrite) throws Exception {
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedInsert() throws Exception {
         for (int i = 10; i <= 100; i += 10)
             ignite(0).cache(DEFAULT_CACHE_NAME).put(i, i * 100);
@@ -152,6 +157,7 @@ public void testStreamedInsert() throws Exception {
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedInsertWithOverwritesAllowed() throws Exception {
         for (int i = 10; i <= 100; i += 10)
             ignite(0).cache(DEFAULT_CACHE_NAME).put(i, i * 100);
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoDefaultCacheTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoDefaultCacheTest.java
index 5c549a82712b..5e6cac65c8ab 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoDefaultCacheTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcNoDefaultCacheTest.java
@@ -32,12 +32,16 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcNoDefaultCacheTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -102,6 +106,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDefaults() throws Exception {
         String url = CFG_URL_PREFIX + CFG_URL;
 
@@ -119,6 +124,7 @@ public void testDefaults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNoCacheNameQuery() throws Exception {
         try (
             Connection conn = DriverManager.getConnection(CFG_URL_PREFIX + CFG_URL);
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcPreparedStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcPreparedStatementSelfTest.java
index 0a48961cfbf1..16f3e8d52e07 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcPreparedStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcPreparedStatementSelfTest.java
@@ -37,6 +37,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Types.BIGINT;
 import static java.sql.Types.BINARY;
@@ -59,6 +62,7 @@
 /**
  * Prepared statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcPreparedStatementSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -154,6 +158,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRepeatableUsage() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where id = ?");
 
@@ -189,6 +194,7 @@ public void testRepeatableUsage() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where boolVal is not distinct from ?");
 
@@ -226,6 +232,7 @@ public void testBoolean() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testByte() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where byteVal is not distinct from ?");
 
@@ -263,6 +270,7 @@ public void testByte() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShort() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where shortVal is not distinct from ?");
 
@@ -300,6 +308,7 @@ public void testShort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInteger() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where intVal is not distinct from ?");
 
@@ -337,6 +346,7 @@ public void testInteger() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLong() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where longVal is not distinct from ?");
 
@@ -374,6 +384,7 @@ public void testLong() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFloat() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where floatVal is not distinct from ?");
 
@@ -411,6 +422,7 @@ public void testFloat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDouble() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where doubleVal is not distinct from ?");
 
@@ -448,6 +460,7 @@ public void testDouble() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimal() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where bigVal is not distinct from ?");
 
@@ -485,6 +498,7 @@ public void testBigDecimal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testString() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where strVal is not distinct from ?");
 
@@ -522,6 +536,7 @@ public void testString() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testArray() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where arrVal is not distinct from ?");
 
@@ -559,6 +574,7 @@ public void testArray() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBlob() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where blobVal is not distinct from ?");
 
@@ -600,6 +616,7 @@ public void testBlob() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDate() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where dateVal is not distinct from ?");
 
@@ -637,6 +654,7 @@ public void testDate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTime() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where timeVal is not distinct from ?");
 
@@ -674,6 +692,7 @@ public void testTime() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimestamp() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where tsVal is not distinct from ?");
 
@@ -711,6 +730,7 @@ public void testTimestamp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUrl() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where urlVal is not distinct from ?");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSetSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSetSelfTest.java
index bd73bcd8d274..84dc081009ab 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSetSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSetSelfTest.java
@@ -45,6 +45,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -55,6 +58,7 @@
  * Result set test.
  */
 @SuppressWarnings("FloatingPointEquality")
+@RunWith(JUnit4.class)
 public class JdbcResultSetSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -164,6 +168,7 @@ private TestObject createObjectWithData(int id) throws MalformedURLException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -244,6 +249,7 @@ public void testBoolean() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean2() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -264,6 +270,7 @@ public void testBoolean2() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean3() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -284,6 +291,7 @@ public void testBoolean3() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean4() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -304,6 +312,7 @@ public void testBoolean4() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testByte() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -344,6 +353,7 @@ public void testByte() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShort() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -384,6 +394,7 @@ public void testShort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInteger() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -424,6 +435,7 @@ public void testInteger() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLong() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -464,6 +476,7 @@ public void testLong() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFloat() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -504,6 +517,7 @@ public void testFloat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDouble() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -544,6 +558,7 @@ public void testDouble() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimal() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -584,6 +599,7 @@ public void testBigDecimal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimalScale() throws Exception {
         assert "0.12".equals(convertStringToBigDecimalViaJdbc("0.1234", 2).toString());
         assert "1.001".equals(convertStringToBigDecimalViaJdbc("1.0005", 3).toString());
@@ -608,6 +624,7 @@ private BigDecimal convertStringToBigDecimalViaJdbc(String strDec, int scale) th
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testString() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -647,6 +664,7 @@ public void testString() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testArray() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -668,6 +686,7 @@ public void testArray() throws Exception {
      * @throws Exception If failed.
      */
     @SuppressWarnings("deprecation")
+    @Test
     public void testDate() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -696,6 +715,7 @@ public void testDate() throws Exception {
      * @throws Exception If failed.
      */
     @SuppressWarnings("deprecation")
+    @Test
     public void testTime() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -723,6 +743,7 @@ public void testTime() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimestamp() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -750,6 +771,7 @@ public void testTimestamp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUrl() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -770,6 +792,7 @@ public void testUrl() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testObject() throws Exception {
         final Ignite ignite = ignite(0);
         final boolean binaryMarshaller = ignite.configuration().getMarshaller() instanceof BinaryMarshaller;
@@ -804,6 +827,7 @@ public void testObject() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNavigation() throws Exception {
         ResultSet rs = stmt.executeQuery("select * from TestObject where id > 0");
 
@@ -849,6 +873,7 @@ public void testNavigation() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFetchSize() throws Exception {
         stmt.setFetchSize(1);
 
@@ -864,6 +889,7 @@ public void testFetchSize() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNewQueryTaskFetchSize() throws Exception {
         stmt.setFetchSize(1);
 
@@ -883,6 +909,7 @@ public void testNewQueryTaskFetchSize() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFindColumn() throws Exception {
         final ResultSet rs = stmt.executeQuery(SQL);
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcSpringSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcSpringSelfTest.java
index 7a29b13d7ee5..f5ab95ccc0ef 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcSpringSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcSpringSelfTest.java
@@ -31,12 +31,16 @@
 import org.apache.ignite.internal.util.spring.IgniteSpringHelper;
 import org.apache.ignite.resources.SpringApplicationContextResource;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 
 /**
  * Test of cluster and JDBC driver with config that contains cache with POJO store and datasource bean.
  */
+@RunWith(JUnit4.class)
 public class JdbcSpringSelfTest extends JdbcConnectionSelfTest {
     /** Grid count. */
     private static final int GRID_CNT = 2;
@@ -61,6 +65,7 @@
     }
 
     /** {@inheritDoc} */
+    @Test
     @Override public void testClientNodeId() throws Exception {
         IgniteEx client = (IgniteEx) startGridWithSpringCtx(getTestIgniteInstanceName(), true, configURL());
 
@@ -96,6 +101,7 @@
      *
      * @throws Exception If test failed.
      */
+    @Test
     public void testSpringBean() throws Exception {
         String url = CFG_URL_PREFIX + configURL();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementBatchingSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementBatchingSelfTest.java
index c9169b98a6bd..88fe2358cabb 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementBatchingSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementBatchingSelfTest.java
@@ -23,10 +23,14 @@
 import java.sql.Statement;
 import java.util.concurrent.Callable;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Statement batch test.
  */
+@RunWith(JUnit4.class)
 public class JdbcStatementBatchingSelfTest extends JdbcAbstractDmlStatementSelfTest {
 
     /** {@inheritDoc} */
@@ -39,6 +43,7 @@
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testDatabaseMetadataBatchSupportFlag() throws SQLException {
         DatabaseMetaData meta = conn.getMetaData();
 
@@ -50,6 +55,7 @@ public void testDatabaseMetadataBatchSupportFlag() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatch() throws SQLException {
         try (Statement stmt = conn.createStatement()) {
             stmt.addBatch("INSERT INTO Person(_key, id, firstName, lastName, age, data) " +
@@ -78,6 +84,7 @@ public void testBatch() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testErrorAmidstBatch() throws SQLException {
         BatchUpdateException reason = (BatchUpdateException)
             GridTestUtils.assertThrows(log,
@@ -110,6 +117,7 @@ public void testErrorAmidstBatch() throws SQLException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClearBatch() throws Exception {
         try (Statement stmt = conn.createStatement()) {
             GridTestUtils.assertThrows(log, new Callable<Object>() {
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementSelfTest.java
index f778fde2f3b5..b84109b15eec 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStatementSelfTest.java
@@ -32,6 +32,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -40,6 +43,7 @@
 /**
  * Statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcStatementSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -119,6 +123,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecuteQuery() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -151,6 +156,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecute() throws Exception {
         assert stmt.execute(SQL);
 
@@ -185,6 +191,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMaxRows() throws Exception {
         stmt.setMaxRows(1);
 
@@ -248,6 +255,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecuteQueryMultipleOnlyResultSets() throws Exception {
         assert conn.getMetaData().supportsMultipleResultSets();
 
@@ -276,6 +284,7 @@ public void testExecuteQueryMultipleOnlyResultSets() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecuteQueryMultipleOnlyDml() throws Exception {
         assert conn.getMetaData().supportsMultipleResultSets();
 
@@ -312,6 +321,7 @@ public void testExecuteQueryMultipleOnlyDml() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecuteQueryMultipleMixed() throws Exception {
         assert conn.getMetaData().supportsMultipleResultSets();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingSelfTest.java
index bc545ac70f1f..bd390ba41315 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingSelfTest.java
@@ -26,7 +26,6 @@
 import java.util.Properties;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteJdbcDriver;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjectBuilder;
 import org.apache.ignite.configuration.CacheConfiguration;
@@ -39,7 +38,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -48,6 +49,7 @@
 /**
  * Data streaming test.
  */
+@RunWith(JUnit4.class)
 public class JdbcStreamingSelfTest extends JdbcThinAbstractSelfTest {
     /** JDBC URL. */
     private static final String BASE_URL = CFG_URL_PREFIX +
@@ -165,6 +167,7 @@ protected Connection createStreamedConnection(boolean allowOverwrite, long flush
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedInsert() throws Exception {
         for (int i = 10; i <= 100; i += 10)
             put(i, nameForId(i * 100));
@@ -195,6 +198,7 @@ public void testStreamedInsert() throws Exception {
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedInsertWithoutColumnsList() throws Exception {
         for (int i = 10; i <= 100; i += 10)
             put(i, nameForId(i * 100));
@@ -225,6 +229,7 @@ public void testStreamedInsertWithoutColumnsList() throws Exception {
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedInsertWithOverwritesAllowed() throws Exception {
         for (int i = 10; i <= 100; i += 10)
             put(i, nameForId(i * 100));
@@ -250,6 +255,7 @@ public void testStreamedInsertWithOverwritesAllowed() throws Exception {
     }
 
     /** */
+    @Test
     public void testOnlyInsertsAllowed() {
         assertStatementForbidden("CREATE TABLE PUBLIC.X (x int primary key, y int)");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingToPublicCacheTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingToPublicCacheTest.java
index 20fd0fbbe392..e4491ae59d15 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingToPublicCacheTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcStreamingToPublicCacheTest.java
@@ -31,6 +31,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -39,6 +42,7 @@
 /**
  * Data streaming test.
  */
+@RunWith(JUnit4.class)
 public class JdbcStreamingToPublicCacheTest extends GridCommonAbstractTest {
     /** JDBC URL. */
     private static final String BASE_URL = CFG_URL_PREFIX + "cache=%s@modules/clients/src/test/config/jdbc-config.xml";
@@ -105,6 +109,7 @@ private Connection createConnection(String cacheName, boolean streaming) throws
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedInsert() throws Exception {
         // Create table
         try (Connection conn = createConnection(DEFAULT_CACHE_NAME, false)) {
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcUpdateStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcUpdateStatementSelfTest.java
index 07b5587ffedd..3da079fae5ec 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcUpdateStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcUpdateStatementSelfTest.java
@@ -22,14 +22,19 @@
 import java.util.Arrays;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcUpdateStatementSelfTest extends JdbcAbstractUpdateStatementSelfTest {
     /**
      *
      */
+    @Test
     public void testExecute() throws SQLException {
         conn.createStatement().execute("update Person set firstName = 'Jack' where " +
             "cast(substring(_key, 2, 1) as int) % 2 = 0");
@@ -41,6 +46,7 @@ public void testExecute() throws SQLException {
     /**
      *
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         conn.createStatement().executeUpdate("update Person set firstName = 'Jack' where " +
                 "cast(substring(_key, 2, 1) as int) % 2 = 0");
@@ -52,6 +58,7 @@ public void testExecuteUpdate() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatch() throws SQLException {
         PreparedStatement ps = conn.prepareStatement("update Person set lastName = concat(firstName, 'son') " +
             "where firstName = ?");
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ChangeStateCommandHandlerTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ChangeStateCommandHandlerTest.java
index cb882e7393c8..a012139cdad2 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ChangeStateCommandHandlerTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ChangeStateCommandHandlerTest.java
@@ -30,12 +30,16 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.internal.client.GridClientProtocol.TCP;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class ChangeStateCommandHandlerTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -94,6 +98,7 @@
     /**
      *
      */
+    @Test
     public void testActivateDeActivate() throws GridClientException {
         GridClientClusterState state = client.state();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ClientMemcachedProtocolSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ClientMemcachedProtocolSelfTest.java
index f80b5e92a52e..6f83f50e16b9 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ClientMemcachedProtocolSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/ClientMemcachedProtocolSelfTest.java
@@ -29,12 +29,16 @@
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.util.typedef.F;
 import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.junit.Assert.assertArrayEquals;
 
 /**
  * Tests for TCP binary protocol.
  */
+@RunWith(JUnit4.class)
 public class ClientMemcachedProtocolSelfTest extends AbstractRestProcessorSelfTest {
     /** Grid count. */
     private static final int GRID_CNT = 1;
@@ -92,6 +96,7 @@ private MemcachedClientIF startClient() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGet() throws Exception {
         jcache().put("getKey1", "getVal1");
         jcache().put("getKey2", "getVal2");
@@ -104,6 +109,7 @@ public void testGet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetBulk() throws Exception {
         jcache().put("getKey1", "getVal1");
         jcache().put("getKey2", "getVal2");
@@ -122,6 +128,7 @@ public void testGetBulk() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSet() throws Exception {
         Assert.assertTrue(client.set("setKey", 0, "setVal").get());
 
@@ -131,6 +138,7 @@ public void testSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetWithExpiration() throws Exception {
         Assert.assertTrue(client.set("setKey", 2000, "setVal").get());
 
@@ -144,6 +152,7 @@ public void testSetWithExpiration() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAdd() throws Exception {
         jcache().put("addKey1", "addVal1");
 
@@ -157,6 +166,7 @@ public void testAdd() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAddWithExpiration() throws Exception {
         Assert.assertTrue(client.add("addKey", 2000, "addVal").get());
 
@@ -170,6 +180,7 @@ public void testAddWithExpiration() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplace() throws Exception {
         Assert.assertFalse(client.replace("replaceKey", 0, "replaceVal").get());
 
@@ -184,6 +195,7 @@ public void testReplace() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplaceWithExpiration() throws Exception {
         jcache().put("replaceKey", "replaceVal");
 
@@ -199,6 +211,7 @@ public void testReplaceWithExpiration() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDelete() throws Exception {
         Assert.assertFalse(client.delete("deleteKey").get());
 
@@ -212,6 +225,7 @@ public void testDelete() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncrement() throws Exception {
         Assert.assertEquals(5, client.incr("incrKey", 3, 2));
 
@@ -225,6 +239,7 @@ public void testIncrement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDecrement() throws Exception {
         Assert.assertEquals(5, client.decr("decrKey", 10, 15));
 
@@ -238,6 +253,7 @@ public void testDecrement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFlush() throws Exception {
         jcache().put("flushKey1", "flushVal1");
         jcache().put("flushKey2", "flushVal2");
@@ -252,6 +268,7 @@ public void testFlush() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testStat() throws Exception {
         jcache().put("statKey1", "statVal1");
         assertEquals("statVal1", jcache().get("statKey1"));
@@ -283,6 +300,7 @@ public void testStat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAppend() throws Exception {
         Assert.assertFalse(client.append(0, "appendKey", "_suffix").get());
 
@@ -298,6 +316,7 @@ public void testAppend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepend() throws Exception {
         Assert.assertFalse(client.append(0, "prependKey", "_suffix").get());
 
@@ -313,6 +332,7 @@ public void testPrepend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSpecialTypes() throws Exception {
         Assert.assertTrue(client.set("boolKey", 0, true).get());
 
@@ -361,6 +381,7 @@ public void testSpecialTypes() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testComplexObject() throws Exception {
         Assert.assertTrue(client.set("objKey", 0, new ValueObject(10, "String")).get());
 
@@ -370,6 +391,7 @@ public void testComplexObject() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCustomPort() throws Exception {
         customPort = 11212;
 
@@ -392,6 +414,7 @@ public void testCustomPort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testVersion() throws Exception {
         Map<SocketAddress, String> map = client.getVersions();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
index a972bc33f199..1f6d1391a115 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
@@ -139,6 +139,9 @@
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheMode.REPLICATED;
@@ -154,6 +157,7 @@
  * Tests for Jetty REST protocol.
  */
 @SuppressWarnings("unchecked")
+@RunWith(JUnit4.class)
 public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProcessorCommonSelfTest {
     /** Used to sent request charset. */
     private static final String CHARSET = StandardCharsets.UTF_8.name();
@@ -285,6 +289,7 @@ protected JsonNode jsonTaskResult(String content) throws IOException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGet() throws Exception {
         jcache().put("getKey", "getVal");
 
@@ -313,6 +318,7 @@ private void checkJson(String json, Person p) throws IOException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetBinaryObjects() throws Exception {
         Person p = new Person(1, "John", "Doe", 300);
 
@@ -409,6 +415,7 @@ public void testGetBinaryObjects() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNullMapKeyAndValue() throws Exception {
         Map<String, String> map1 = new HashMap<>();
         map1.put(null, null);
@@ -442,6 +449,7 @@ public void testNullMapKeyAndValue() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSimpleObject() throws Exception {
         SimplePerson p = new SimplePerson(1, "Test", java.sql.Date.valueOf("1977-01-26"), 1000.55, 39, "CIO", 25);
 
@@ -465,6 +473,7 @@ public void testSimpleObject() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDate() throws Exception {
         java.util.Date utilDate = new java.util.Date();
 
@@ -502,6 +511,7 @@ public void testDate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUUID() throws Exception {
         UUID uuid = UUID.randomUUID();
 
@@ -527,6 +537,7 @@ public void testUUID() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTuple() throws Exception {
         T2 t = new T2("key", "value");
 
@@ -545,6 +556,7 @@ public void testTuple() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheSize() throws Exception {
         jcache().removeAll();
 
@@ -560,6 +572,7 @@ public void testCacheSize() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIgniteName() throws Exception {
         String ret = content(null, GridRestCommand.NAME);
 
@@ -613,6 +626,7 @@ private void checkGetOrCreateAndDestroy(
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetOrCreateCache() throws Exception {
         checkGetOrCreateAndDestroy("testCache", PARTITIONED, 0, FULL_SYNC, null, null);
 
@@ -662,6 +676,7 @@ public void testGetOrCreateCache() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAll() throws Exception {
         final Map<String, String> entries = F.asMap("getKey1", "getVal1", "getKey2", "getVal2");
 
@@ -684,6 +699,7 @@ public void testGetAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncorrectPut() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT, "key", "key0");
 
@@ -694,6 +710,7 @@ public void testIncorrectPut() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testContainsKey() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -705,6 +722,7 @@ public void testContainsKey() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testContainsKeys() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
         grid(0).cache(DEFAULT_CACHE_NAME).put("key1", "val1");
@@ -720,6 +738,7 @@ public void testContainsKeys() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAndPut() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -736,6 +755,7 @@ public void testGetAndPut() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAndPutIfAbsent() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -752,6 +772,7 @@ public void testGetAndPutIfAbsent() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutIfAbsent2() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT_IF_ABSENT,
             "key", "key0",
@@ -766,6 +787,7 @@ public void testPutIfAbsent2() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemoveValue() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -791,6 +813,7 @@ public void testRemoveValue() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAndRemove() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -804,6 +827,7 @@ public void testGetAndRemove() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplaceValue() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -831,6 +855,7 @@ public void testReplaceValue() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAndReplace() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
@@ -847,6 +872,7 @@ public void testGetAndReplace() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDeactivateActivate() throws Exception {
         assertClusterState(true);
 
@@ -863,6 +889,7 @@ public void testDeactivateActivate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPut() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT,
             "key", "putKey",
@@ -879,6 +906,7 @@ public void testPut() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutWithExpiration() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT,
             "key", "putKey",
@@ -898,6 +926,7 @@ public void testPutWithExpiration() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAdd() throws Exception {
         jcache().put("addKey1", "addVal1");
 
@@ -915,6 +944,7 @@ public void testAdd() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAddWithExpiration() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_ADD,
             "key", "addKey",
@@ -934,6 +964,7 @@ public void testAddWithExpiration() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutAll() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT_ALL,
             "k1", "putKey1",
@@ -953,6 +984,7 @@ public void testPutAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemove() throws Exception {
         jcache().put("rmvKey", "rmvVal");
 
@@ -970,6 +1002,7 @@ public void testRemove() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemoveAll() throws Exception {
         jcache().put("rmvKey1", "rmvVal1");
         jcache().put("rmvKey2", "rmvVal2");
@@ -1011,6 +1044,7 @@ public void testRemoveAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCas() throws Exception {
         jcache().put("casKey", "casOldVal");
 
@@ -1034,6 +1068,7 @@ public void testCas() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplace() throws Exception {
         jcache().put("repKey", "repOldVal");
 
@@ -1054,6 +1089,7 @@ public void testReplace() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplaceWithExpiration() throws Exception {
         jcache().put("replaceKey", "replaceVal");
 
@@ -1078,6 +1114,7 @@ public void testReplaceWithExpiration() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAppend() throws Exception {
         jcache().put("appendKey", "appendVal");
 
@@ -1094,6 +1131,7 @@ public void testAppend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepend() throws Exception {
         jcache().put("prependKey", "prependVal");
 
@@ -1110,6 +1148,7 @@ public void testPrepend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncrement() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.ATOMIC_INCREMENT,
             "key", "incrKey",
@@ -1136,6 +1175,7 @@ public void testIncrement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDecrement() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.ATOMIC_DECREMENT,
             "key", "decrKey",
@@ -1162,6 +1202,7 @@ public void testDecrement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCar() throws Exception {
         jcache().put("casKey", "casOldVal");
 
@@ -1182,6 +1223,7 @@ public void testCar() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutIfAbsent() throws Exception {
         assertNull(jcache().localPeek("casKey"));
 
@@ -1200,6 +1242,7 @@ public void testPutIfAbsent() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCasRemove() throws Exception {
         jcache().put("casKey", "casVal");
 
@@ -1217,6 +1260,7 @@ public void testCasRemove() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetrics() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_METRICS);
 
@@ -1306,6 +1350,7 @@ private void testMetadata(Collection<GridCacheSqlMetadata> metas, JsonNode arr)
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetadataLocal() throws Exception {
         IgniteCacheProxy<?, ?> cache = F.first(grid(0).context().cache().publicCaches());
 
@@ -1347,6 +1392,7 @@ public void testMetadataLocal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetadataRemote() throws Exception {
         CacheConfiguration<Integer, String> partialCacheCfg = new CacheConfiguration<>("partial");
 
@@ -1386,6 +1432,7 @@ public void testMetadataRemote() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTopology() throws Exception {
         String ret = content(null, GridRestCommand.TOPOLOGY,
             "attr", "false",
@@ -1428,11 +1475,31 @@ public void testTopology() throws Exception {
                 assertEquals(publicCache.getConfiguration(CacheConfiguration.class).getCacheMode(), cacheMode);
             }
         }
+
+        // Test that caches not included.
+        ret = content(null, GridRestCommand.TOPOLOGY,
+            "attr", "false",
+            "mtr", "false",
+            "caches", "false"
+        );
+
+        info("Topology command result: " + ret);
+
+        res = jsonResponse(ret);
+
+        assertEquals(gridCount(), res.size());
+
+        for (JsonNode node : res) {
+            assertTrue(node.get("attributes").isNull());
+            assertTrue(node.get("metrics").isNull());
+            assertTrue(node.get("caches").isNull());
+        }
     }
 
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNode() throws Exception {
         String ret = content(null, GridRestCommand.NODE,
             "attr", "true",
@@ -1447,6 +1514,12 @@ public void testNode() throws Exception {
         assertTrue(res.get("attributes").isObject());
         assertTrue(res.get("metrics").isObject());
 
+        JsonNode caches = res.get("caches");
+
+        assertTrue(caches.isArray());
+        assertFalse(caches.isNull());
+        assertEquals(grid(0).context().cache().publicCaches().size(), caches.size());
+
         ret = content(null, GridRestCommand.NODE,
             "attr", "false",
             "mtr", "false",
@@ -1472,6 +1545,22 @@ public void testNode() throws Exception {
         res = jsonResponse(ret);
 
         assertTrue(res.isNull());
+
+        // Check that caches not included.
+        ret = content(null, GridRestCommand.NODE,
+            "id", grid(0).localNode().id().toString(),
+            "attr", "false",
+            "mtr", "false",
+            "caches", "false"
+        );
+
+        info("Topology command result: " + ret);
+
+        res = jsonResponse(ret);
+
+        assertTrue(res.get("attributes").isNull());
+        assertTrue(res.get("metrics").isNull());
+        assertTrue(res.get("caches").isNull());
     }
 
     /**
@@ -1481,6 +1570,7 @@ public void testNode() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testExe() throws Exception {
         String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.EXE);
 
@@ -1526,6 +1616,7 @@ public void testExe() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testVisorGateway() throws Exception {
         ClusterNode locNode = grid(1).localNode();
 
@@ -1883,6 +1974,7 @@ public void testVisorGateway() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testVersion() throws Exception {
         String ret = content(null, GridRestCommand.VERSION);
 
@@ -1894,6 +1986,7 @@ public void testVersion() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQueryArgs() throws Exception {
         String qry = "salary > ? and salary <= ?";
 
@@ -1915,6 +2008,7 @@ public void testQueryArgs() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQueryScan() throws Exception {
         String ret = content("person", GridRestCommand.EXECUTE_SCAN_QUERY,
             "pageSize", "10",
@@ -1931,6 +2025,7 @@ public void testQueryScan() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFilterQueryScan() throws Exception {
         String ret = content("person", GridRestCommand.EXECUTE_SCAN_QUERY,
             "pageSize", "10",
@@ -1947,6 +2042,7 @@ public void testFilterQueryScan() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncorrectFilterQueryScan() throws Exception {
         String clsName = ScanFilter.class.getName() + 1;
 
@@ -1961,6 +2057,7 @@ public void testIncorrectFilterQueryScan() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQuery() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("1", "1");
         grid(0).cache(DEFAULT_CACHE_NAME).put("2", "2");
@@ -2006,6 +2103,7 @@ public void testQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDistributedJoinsQuery() throws Exception {
         String qry = "select * from Person, \"organization\".Organization " +
             "where \"organization\".Organization.id = Person.orgId " +
@@ -2029,6 +2127,7 @@ public void testDistributedJoinsQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlFieldsQuery() throws Exception {
         String qry = "select concat(firstName, ' ', lastName) from Person";
 
@@ -2047,6 +2146,7 @@ public void testSqlFieldsQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDistributedJoinsSqlFieldsQuery() throws Exception {
         String qry = "select * from \"person\".Person p, \"organization\".Organization o where o.id = p.orgId";
 
@@ -2066,6 +2166,7 @@ public void testDistributedJoinsSqlFieldsQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlFieldsMetadataQuery() throws Exception {
         String qry = "select firstName, lastName from Person";
 
@@ -2096,6 +2197,7 @@ public void testSqlFieldsMetadataQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQueryClose() throws Exception {
         String qry = "salary > ? and salary <= ?";
 
@@ -2125,6 +2227,7 @@ public void testQueryClose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQueryDelay() throws Exception {
         String qry = "salary > ? and salary <= ?";
 
@@ -2187,6 +2290,7 @@ private void putTypedValue(String type, String k, String v, int status) throws E
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTypedPut() throws Exception {
         // Test boolean type.
         putTypedValue("boolean", "true", "false", STATUS_SUCCESS);
@@ -2364,6 +2468,7 @@ private void getTypedValue(String keyType, String k, String exp) throws Exceptio
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTypedGet() throws Exception {
         // Test boolean type.
         IgniteCache<Boolean, Boolean> cBool = typedCache();
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationAbstractTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationAbstractTest.java
index 0ed9e95e9c62..2e2982d136a7 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationAbstractTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationAbstractTest.java
@@ -26,12 +26,16 @@
 import org.apache.ignite.internal.processors.authentication.IgniteAuthenticationProcessor;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.configuration.WALMode.NONE;
 
 /**
  * Test REST with enabled authentication.
  */
+@RunWith(JUnit4.class)
 public abstract class JettyRestProcessorAuthenticationAbstractTest extends JettyRestProcessorUnsignedSelfTest {
     /** */
     protected static final String DFLT_USER = "ignite";
@@ -90,6 +94,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAuthenticationCommand() throws Exception {
         String ret = content(null, GridRestCommand.AUTHENTICATE);
 
@@ -99,6 +104,7 @@ public void testAuthenticationCommand() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAddUpdateRemoveUser() throws Exception {
         // Add user.
         String ret = content(null, GridRestCommand.ADD_USER,
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationWithTokenSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationWithTokenSelfTest.java
index 0a1b6b9d802f..bf2ddac9b0f1 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationWithTokenSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAuthenticationWithTokenSelfTest.java
@@ -18,10 +18,14 @@
 package org.apache.ignite.internal.processors.rest;
 
 import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test REST with enabled authentication and token.
  */
+@RunWith(JUnit4.class)
 public class JettyRestProcessorAuthenticationWithTokenSelfTest extends JettyRestProcessorAuthenticationAbstractTest {
     /** */
     private String tok = "";
@@ -56,6 +60,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInvalidSessionToken() throws Exception {
         tok = null;
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorBaselineSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorBaselineSelfTest.java
new file mode 100644
index 000000000000..1a83a43cd743
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorBaselineSelfTest.java
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.rest;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import org.apache.ignite.cluster.BaselineNode;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.processors.rest.handlers.cluster.GridBaselineCommandResponse;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+
+import static org.apache.ignite.configuration.WALMode.NONE;
+import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_SUCCESS;
+
+/**
+ * Test REST with enabled authentication.
+ */
+public class JettyRestProcessorBaselineSelfTest extends JettyRestProcessorCommonSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        U.resolveWorkDirectory(U.defaultWorkDirectory(), "db", true);
+
+        super.beforeTestsStarted();
+
+        // We need to activate cluster.
+        grid(0).cluster().active(true);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        grid(0).cluster().setBaselineTopology(grid(0).cluster().topologyVersion());
+    }
+
+    /** {@inheritDoc} */
+    @Override protected String signature() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        DataStorageConfiguration dsCfg = new DataStorageConfiguration()
+            .setDefaultDataRegionConfiguration(new DataRegionConfiguration()
+                .setMaxSize(100 * 1024 * 1024)
+                .setPersistenceEnabled(true))
+            .setWalMode(NONE);
+
+        cfg.setDataStorageConfiguration(dsCfg);
+
+        return cfg;
+    }
+
+    /**
+     * @param nodes Collection of grid nodes.
+     * @return Collection of node consistent IDs for given collection of grid nodes.
+     */
+    private static Collection<String> nodeConsistentIds(@Nullable Collection<? extends BaselineNode> nodes) {
+        if (nodes == null || nodes.isEmpty())
+            return Collections.emptyList();
+
+        return F.viewReadOnly(nodes, n -> String.valueOf(n.consistentId()));
+    }
+
+    /**
+     * @param content Content to check.
+     * @param baselineSz Expected baseline size.
+     * @param srvsSz Expected server nodes count.
+     */
+    private void assertBaseline(String content, int baselineSz, int srvsSz) throws IOException {
+        assertNotNull(content);
+        assertFalse(content.isEmpty());
+
+        JsonNode node = JSON_MAPPER.readTree(content);
+
+        assertEquals(STATUS_SUCCESS, node.get("successStatus").asInt());
+        assertTrue(node.get("error").isNull());
+
+        assertNotSame(securityEnabled(), node.get("sessionToken").isNull());
+
+        JsonNode res = node.get("response");
+
+        assertFalse(res.isNull());
+
+        GridBaselineCommandResponse baseline = JSON_MAPPER.treeToValue(res, GridBaselineCommandResponse.class);
+
+        assertTrue(baseline.isActive());
+        assertEquals(grid(0).cluster().topologyVersion(), baseline.getTopologyVersion());
+        assertEquals(baselineSz, baseline.getBaseline().size());
+        assertEqualsCollections(nodeConsistentIds(grid(0).cluster().currentBaselineTopology()), baseline.getBaseline());
+        assertEquals(srvsSz, baseline.getServers().size());
+        assertEqualsCollections(nodeConsistentIds(grid(0).cluster().nodes()), baseline.getServers());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testBaseline() throws Exception {
+        int sz = gridCount();
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz);
+
+        // Stop one node. It will stay in baseline.
+        stopGrid(sz - 1);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz - 1);
+
+        // Start one node. Server node will be added, but baseline will not change.
+        startGrid(sz - 1);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testBaselineSet() throws Exception {
+        int sz = gridCount();
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz);
+
+        startGrid(sz);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz + 1);
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_SET, "topVer",
+            String.valueOf(grid(0).cluster().topologyVersion())), sz + 1, sz + 1);
+
+        stopGrid(sz);
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz + 1, sz);
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_SET, "topVer",
+            String.valueOf(grid(0).cluster().topologyVersion())), sz, sz);
+
+        startGrid(sz);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz + 1);
+
+        ArrayList<String> params = new ArrayList<>();
+        int i = 1;
+
+        for (BaselineNode n : grid(0).cluster().nodes()) {
+            params.add("consistentId" + i++);
+            params.add(String.valueOf(n.consistentId()));
+        }
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_SET, params.toArray(new String[0])),
+            sz + 1, sz + 1);
+
+        stopGrid(sz);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testBaselineAdd() throws Exception {
+        int sz = gridCount();
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz);
+
+        startGrid(sz);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz + 1);
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_ADD, "consistentId1",
+            grid(sz).localNode().consistentId().toString()), sz + 1, sz + 1);
+
+        stopGrid(sz);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testBaselineRemove() throws Exception {
+        int sz = gridCount();
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz);
+
+        startGrid(sz);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz, sz + 1);
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_SET, "topVer",
+            String.valueOf(grid(0).cluster().topologyVersion())), sz + 1, sz + 1);
+
+        String consistentId = grid(sz).localNode().consistentId().toString();
+
+        stopGrid(sz);
+        assertBaseline(content(null, GridRestCommand.BASELINE_CURRENT_STATE), sz + 1, sz);
+
+        assertBaseline(content(null, GridRestCommand.BASELINE_REMOVE, "consistentId1",
+            consistentId), sz, sz);
+    }
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorGetAllAsArrayTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorGetAllAsArrayTest.java
index 521d7c18e991..3017d87a558c 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorGetAllAsArrayTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorGetAllAsArrayTest.java
@@ -22,11 +22,15 @@
 import java.util.Map;
 import java.util.Set;
 import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_REST_GETALL_AS_ARRAY;
 import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_SUCCESS;
 
 /** */
+@RunWith(JUnit4.class)
 public class JettyRestProcessorGetAllAsArrayTest extends JettyRestProcessorCommonSelfTest {
     /** {@inheritDoc} */
     @Override protected void beforeTestsStarted() throws Exception {
@@ -45,6 +49,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAll() throws Exception {
         final Map<String, String> entries = F.asMap("getKey1", "getVal1", "getKey2", "getVal2");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorSignedSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorSignedSelfTest.java
index 3be99b489eef..b5860dccd834 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorSignedSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorSignedSelfTest.java
@@ -25,10 +25,14 @@
 import java.util.Base64;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JettyRestProcessorSignedSelfTest extends JettyRestProcessorAbstractSelfTest {
     /** */
     protected static final String REST_SECRET_KEY = "secret-key";
@@ -52,6 +56,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUnauthorized() throws Exception {
         String addr = "http://" + LOC_HOST + ":" + restPort() + "/ignite?cacheName=default&cmd=top";
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestBinaryProtocolSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestBinaryProtocolSelfTest.java
index fb56b77a5433..3fe693d02b29 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestBinaryProtocolSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestBinaryProtocolSelfTest.java
@@ -45,7 +45,9 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.LOCAL;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -54,6 +56,7 @@
  * TCP protocol test.
  */
 @SuppressWarnings("unchecked")
+@RunWith(JUnit4.class)
 public class RestBinaryProtocolSelfTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -140,6 +143,7 @@ private TestBinaryClient client() throws IgniteCheckedException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPut() throws Exception {
         assertTrue(client.cachePut(DEFAULT_CACHE_NAME, "key1", "val1"));
         assertEquals("val1", grid().cache(DEFAULT_CACHE_NAME).get("key1"));
@@ -151,6 +155,7 @@ public void testPut() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPutAll() throws Exception {
         client.cachePutAll(DEFAULT_CACHE_NAME, F.asMap("key1", "val1", "key2", "val2"));
 
@@ -172,6 +177,7 @@ public void testPutAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGet() throws Exception {
         grid().cache(DEFAULT_CACHE_NAME).put("key", "val");
 
@@ -185,6 +191,7 @@ public void testGet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFailure() throws Exception {
         IgniteKernal kernal = ((IgniteKernal)grid());
 
@@ -220,6 +227,7 @@ public void testFailure() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAll() throws Exception {
         IgniteCache<Object, Object> jcacheDflt = grid().cache(DEFAULT_CACHE_NAME);
         IgniteCache<Object, Object> jcacheName = grid().cache(CACHE_NAME);
@@ -264,6 +272,7 @@ public void testGetAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemove() throws Exception {
         IgniteCache<Object, Object> jcacheDflt = grid().cache(DEFAULT_CACHE_NAME);
         IgniteCache<Object, Object> jcacheName = grid().cache(CACHE_NAME);
@@ -287,6 +296,7 @@ public void testRemove() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemoveAll() throws Exception {
         IgniteCache<Object, Object> jcacheDflt = grid().cache(DEFAULT_CACHE_NAME);
 
@@ -320,6 +330,7 @@ public void testRemoveAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplace() throws Exception {
         assertFalse(client.cacheReplace(DEFAULT_CACHE_NAME, "key1", "val1"));
 
@@ -342,6 +353,7 @@ public void testReplace() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCompareAndSet() throws Exception {
         assertFalse(client.cacheCompareAndSet(DEFAULT_CACHE_NAME, "key", null, null));
 
@@ -404,6 +416,7 @@ public void testCompareAndSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetrics() throws Exception {
         IgniteCache<Object, Object> jcacheDft = grid().cache(DEFAULT_CACHE_NAME);
         IgniteCache<Object, Object> jcacheName = grid().cache(CACHE_NAME);
@@ -446,6 +459,7 @@ public void testMetrics() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAppend() throws Exception {
         grid().cache(DEFAULT_CACHE_NAME).remove("key");
         grid().cache(CACHE_NAME).remove("key");
@@ -470,6 +484,7 @@ public void testAppend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepend() throws Exception {
         grid().cache(DEFAULT_CACHE_NAME).remove("key");
         grid().cache(CACHE_NAME).remove("key");
@@ -494,6 +509,7 @@ public void testPrepend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecute() throws Exception {
         GridClientTaskResultBean res = client.execute(TestTask.class.getName(),
             Arrays.asList("executing", 3, "test", 5, "task"));
@@ -505,6 +521,7 @@ public void testExecute() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNode() throws Exception {
         assertNull(client.node(UUID.randomUUID(), false, false));
         assertNull(client.node("wrongHost", false, false));
@@ -549,6 +566,7 @@ public void testNode() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTopology() throws Exception {
         List<GridClientNodeBean> top = client.topology(true, true);
 
@@ -614,4 +632,4 @@ public void testTopology() throws Exception {
             return sum;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestMemcacheProtocolSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestMemcacheProtocolSelfTest.java
index 9ac62703d04a..26a5f8fcf39b 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestMemcacheProtocolSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestMemcacheProtocolSelfTest.java
@@ -28,7 +28,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.LOCAL;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -36,7 +38,7 @@
 /**
  * TCP protocol test.
  */
-@SuppressWarnings("unchecked")
+@RunWith(JUnit4.class)
 public class RestMemcacheProtocolSelfTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -123,6 +125,7 @@ private TestMemcacheClient client() throws IgniteCheckedException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPut() throws Exception {
         assertTrue(client.cachePut(null, "key1", "val1"));
         assertEquals("val1", grid().cache(DEFAULT_CACHE_NAME).get("key1"));
@@ -134,6 +137,7 @@ public void testPut() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGet() throws Exception {
         grid().cache(DEFAULT_CACHE_NAME).put("key", "val");
 
@@ -147,6 +151,7 @@ public void testGet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRemove() throws Exception {
         grid().cache(DEFAULT_CACHE_NAME).put("key", "val");
 
@@ -166,6 +171,7 @@ public void testRemove() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAdd() throws Exception {
         assertTrue(client.cacheAdd(null, "key", "val"));
         assertEquals("val", grid().cache(DEFAULT_CACHE_NAME).get("key"));
@@ -181,6 +187,7 @@ public void testAdd() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReplace() throws Exception {
         assertFalse(client.cacheReplace(null, "key1", "val1"));
         grid().cache(DEFAULT_CACHE_NAME).put("key1", "val1");
@@ -200,6 +207,7 @@ public void testReplace() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetrics() throws Exception {
         grid().cache(DEFAULT_CACHE_NAME).localMxBean().clear();
         grid().cache(CACHE_NAME).localMxBean().clear();
@@ -238,6 +246,7 @@ public void testMetrics() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncrement() throws Exception {
         assertEquals(15L, client().increment("key", 10L, 5L));
         assertEquals(15L, grid().atomicLong("key", 0, true).get());
@@ -261,6 +270,7 @@ public void testIncrement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDecrement() throws Exception {
         assertEquals(15L, client().decrement("key", 20L, 5L));
         assertEquals(15L, grid().atomicLong("key", 0, true).get());
@@ -284,6 +294,7 @@ public void testDecrement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAppend() throws Exception {
         assertFalse(client.cacheAppend(null, "wrongKey", "_suffix"));
         assertFalse(client.cacheAppend(CACHE_NAME, "wrongKey", "_suffix"));
@@ -300,6 +311,7 @@ public void testAppend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepend() throws Exception {
         assertFalse(client.cachePrepend(null, "wrongKey", "prefix_"));
         assertFalse(client.cachePrepend(CACHE_NAME, "wrongKey", "prefix_"));
@@ -316,6 +328,7 @@ public void testPrepend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testVersion() throws Exception {
         assertNotNull(client.version());
     }
@@ -323,6 +336,7 @@ public void testVersion() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNoop() throws Exception {
         client.noop();
     }
@@ -330,7 +344,8 @@ public void testNoop() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQuit() throws Exception {
         client.quit();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorMultiStartSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorMultiStartSelfTest.java
index 24274d77d55b..9be68b13d408 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorMultiStartSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorMultiStartSelfTest.java
@@ -22,10 +22,14 @@
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Rest processor test.
  */
+@RunWith(JUnit4.class)
 public class RestProcessorMultiStartSelfTest extends GridCommonAbstractTest {
     /** */
     private static final int GRID_CNT = 3;
@@ -55,6 +59,7 @@
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testMultiStart() throws Exception {
         try {
             for (int i = 0; i < GRID_CNT; i++)
@@ -72,6 +77,7 @@ public void testMultiStart() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testMultiStartWithClient() throws Exception {
         try {
             int clnIdx = GRID_CNT - 1;
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorStartSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorStartSelfTest.java
index 477c41ab35bb..6026785cc100 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorStartSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorStartSelfTest.java
@@ -35,10 +35,14 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class RestProcessorStartSelfTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -92,6 +96,7 @@
     /**
      *  @throws Exception If failed.
      */
+    @Test
     public void testTcpStart() throws Exception {
         GridClientConfiguration clCfg = new GridClientConfiguration();
 
@@ -165,4 +170,4 @@ private void doTest(final GridClientConfiguration cfg) throws Exception {
             super.spiStart(igniteInstanceName);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TaskCommandHandlerSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TaskCommandHandlerSelfTest.java
index 60e620be4edc..fb7950417693 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TaskCommandHandlerSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TaskCommandHandlerSelfTest.java
@@ -48,6 +48,9 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jsr166.ConcurrentLinkedHashMap;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.LOCAL;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -58,6 +61,7 @@
 /**
  * Test for {@code GridTaskCommandHandler}
  */
+@RunWith(JUnit4.class)
 public class TaskCommandHandlerSelfTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -164,6 +168,7 @@ private GridClientConfiguration clientConfiguration() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testManyTasksRun() throws Exception {
         GridClientCompute compute = client.compute();
 
@@ -221,4 +226,4 @@ public void testManyTasksRun() throws Exception {
             return sum;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TcpRestUnmarshalVulnerabilityTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TcpRestUnmarshalVulnerabilityTest.java
index 92d824be329d..cbb14ffaaa1c 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TcpRestUnmarshalVulnerabilityTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/TcpRestUnmarshalVulnerabilityTest.java
@@ -38,6 +38,9 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHALLER_BLACKLIST;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHALLER_WHITELIST;
@@ -47,6 +50,7 @@
 /**
  * Tests for whitelist and blacklist ot avoiding deserialization vulnerability.
  */
+@RunWith(JUnit4.class)
 public class TcpRestUnmarshalVulnerabilityTest extends GridCommonAbstractTest {
     /** Marshaller. */
     private static final GridClientJdkMarshaller MARSH = new GridClientJdkMarshaller();
@@ -89,6 +93,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNoLists() throws Exception {
         testExploit(true);
     }
@@ -96,6 +101,7 @@ public void testNoLists() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testWhiteListIncluded() throws Exception {
         String path = U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
 
@@ -107,6 +113,7 @@ public void testWhiteListIncluded() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testWhiteListExcluded() throws Exception {
         String path = U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath();
 
@@ -118,6 +125,7 @@ public void testWhiteListExcluded() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBlackListIncluded() throws Exception {
         String path = U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
 
@@ -129,6 +137,7 @@ public void testBlackListIncluded() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBlackListExcluded() throws Exception {
         String path = U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath();
 
@@ -140,6 +149,7 @@ public void testBlackListExcluded() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBothListIncluded() throws Exception {
         String path = U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
 
@@ -266,4 +276,4 @@ private void readObject(ObjectInputStream is) throws ClassNotFoundException, IOE
             // No-op.
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/TcpRestParserSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/TcpRestParserSelfTest.java
index fecd2b977bbd..e230ad441455 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/TcpRestParserSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/TcpRestParserSelfTest.java
@@ -34,6 +34,9 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest.GridCacheOperation.CAS;
 import static org.apache.ignite.internal.processors.rest.protocols.tcp.GridMemcachedMessage.IGNITE_HANDSHAKE_FLAG;
@@ -45,6 +48,7 @@
  * This class tests that parser confirms memcache extended specification.
  */
 @SuppressWarnings("TypeMayBeWeakened")
+@RunWith(JUnit4.class)
 public class TcpRestParserSelfTest extends GridCommonAbstractTest {
     /** Marshaller. */
     private GridClientMarshaller marshaller = new GridClientOptimizedMarshaller();
@@ -58,6 +62,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSimplePacketParsing() throws Exception {
         GridNioSession ses = new MockNioSession();
 
@@ -93,6 +98,7 @@ public void testSimplePacketParsing() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncorrectPackets() throws Exception {
         final GridNioSession ses = new MockNioSession();
 
@@ -142,6 +148,7 @@ public void testIncorrectPackets() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCustomMessages() throws Exception {
         GridClientCacheRequest req = new GridClientCacheRequest(CAS);
 
@@ -178,6 +185,7 @@ public void testCustomMessages() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMixedParsing() throws Exception {
         GridNioSession ses1 = new MockNioSession();
         GridNioSession ses2 = new MockNioSession();
@@ -247,6 +255,7 @@ public void testMixedParsing() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testParseContinuousSplit() throws Exception {
         ByteBuffer tmp = ByteBuffer.allocate(10 * 1024);
 
@@ -301,6 +310,7 @@ public void testParseContinuousSplit() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testParseClientHandshake() throws Exception {
         for (int splitPos = 1; splitPos < 5; splitPos++) {
             log.info("Checking split position: " + splitPos);
@@ -453,4 +463,4 @@ private ByteBuffer rawPacket(byte magic, byte opCode, byte[] opaque, @Nullable b
 
         return res;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolConnectSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolConnectSelfTest.java
index f7fd69a6d58c..ca3859f72a00 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolConnectSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolConnectSelfTest.java
@@ -18,15 +18,20 @@
 package org.apache.ignite.internal.processors.rest.protocols.tcp.redis;
 
 import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 import redis.clients.jedis.Jedis;
 
 /**
  * Tests for Connection commands of Redis protocol.
  */
+@RunWith(JUnit4.class)
 public class RedisProtocolConnectSelfTest extends RedisCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPing() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals("PONG", jedis.ping());
@@ -36,6 +41,7 @@ public void testPing() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testEcho() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals("Hello, grid!", jedis.echo("Hello, grid!"));
@@ -45,6 +51,7 @@ public void testEcho() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelect() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             // connected to cache with index 0
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolServerSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolServerSelfTest.java
index a424d77e89c8..f0f5f477cfb4 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolServerSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolServerSelfTest.java
@@ -19,15 +19,20 @@
 
 import java.util.HashMap;
 import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 import redis.clients.jedis.Jedis;
 
 /**
  * Tests for Server commands of Redis protocol.
  */
+@RunWith(JUnit4.class)
 public class RedisProtocolServerSelfTest extends RedisCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDbSize() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(0, (long)jedis.dbSize());
@@ -46,6 +51,7 @@ public void testDbSize() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFlushDb() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(0, (long)jedis.dbSize());
@@ -82,6 +88,7 @@ public void testFlushDb() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFlushAll() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(0, (long)jedis.dbSize());
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolStringSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolStringSelfTest.java
index 21a988268c23..e192c004f5b2 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolStringSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/protocols/tcp/redis/RedisProtocolStringSelfTest.java
@@ -21,16 +21,21 @@
 import java.util.HashSet;
 import java.util.List;
 import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.exceptions.JedisDataException;
 
 /**
  * Tests for String commands of Redis protocol.
  */
+@RunWith(JUnit4.class)
 public class RedisProtocolStringSelfTest extends RedisCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGet() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             jcache().put("getKey1", "getVal1");
@@ -54,6 +59,7 @@ public void testGet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSet() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             jcache().put("getSetKey1", "1");
@@ -77,6 +83,7 @@ public void testGetSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMGet() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             jcache().put("getKey1", "getVal1");
@@ -96,6 +103,7 @@ public void testMGet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSet() throws Exception {
         long EXPIRE_MS = 1000L;
         int EXPIRE_SEC = 1;
@@ -131,6 +139,7 @@ public void testSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMSet() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             jedis.mset("setKey1", "1", "setKey2", "2");
@@ -143,6 +152,7 @@ public void testMSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncrDecr() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(1, (long)jedis.incr("newKeyIncr"));
@@ -226,6 +236,7 @@ public void testIncrDecr() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIncrDecrBy() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(2, (long)jedis.incrBy("newKeyIncrBy", 2));
@@ -282,6 +293,7 @@ public void testIncrDecrBy() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAppend() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(5, (long)jedis.append("appendKey1", "Hello"));
@@ -303,6 +315,7 @@ public void testAppend() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testStrlen() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(0, (long)jedis.strlen("strlenKeyNonExisting"));
@@ -327,6 +340,7 @@ public void testStrlen() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetRange() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals(0, (long)jedis.setrange("setRangeKey1", 0, ""));
@@ -375,6 +389,7 @@ public void testSetRange() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetRange() throws Exception {
         try (Jedis jedis = pool.getResource()) {
             Assert.assertEquals("", jedis.getrange("getRangeKeyNonExisting", 0, 0));
@@ -402,6 +417,7 @@ public void testGetRange() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDel() throws Exception {
         jcache().put("delKey1", "abc");
         jcache().put("delKey2", "abcd");
@@ -415,6 +431,7 @@ public void testDel() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExists() throws Exception {
         jcache().put("existsKey1", "abc");
         jcache().put("existsKey2", "abcd");
@@ -427,6 +444,7 @@ public void testExists() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExpire() throws Exception {
         testExpire(new Expiration() {
             @Override public long expire(Jedis jedis, String key) {
@@ -438,6 +456,7 @@ public void testExpire() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExpireMs() throws Exception {
         testExpire(new Expiration() {
             @Override public long expire(Jedis jedis, String key) {
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcComplexQuerySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcComplexQuerySelfTest.java
index 3c00288e0fda..935a46271b4b 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcComplexQuerySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcComplexQuerySelfTest.java
@@ -32,6 +32,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -40,6 +43,7 @@
 /**
  * Tests for complex queries (joins, etc.).
  */
+@RunWith(JUnit4.class)
 public class JdbcComplexQuerySelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -126,6 +130,7 @@ protected CacheConfiguration cacheConfiguration() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoin() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name as orgName from \"pers\".Person p, \"org\".Organization o where p.orgId = o.id");
@@ -161,6 +166,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoinWithoutAlias() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name from \"pers\".Person p, \"org\".Organization o where p.orgId = o.id");
@@ -199,6 +205,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIn() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from \"pers\".Person where age in (25, 35)");
 
@@ -219,6 +226,7 @@ public void testIn() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBetween() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from \"pers\".Person where age between 24 and 36");
 
@@ -239,6 +247,7 @@ public void testBetween() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCalculatedValue() throws Exception {
         ResultSet rs = stmt.executeQuery("select age * 2 from \"pers\".Person");
 
@@ -318,4 +327,4 @@ private Organization(int id, String name) {
             this.name = name;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcConnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcConnectionSelfTest.java
index 14d21469468b..1721f1ad9c61 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcConnectionSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcConnectionSelfTest.java
@@ -30,11 +30,14 @@
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Connection test.
  */
+@RunWith(JUnit4.class)
 public class JdbcConnectionSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -96,6 +99,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDefaults() throws Exception {
         String url = URL_PREFIX + HOST;
 
@@ -106,6 +110,7 @@ public void testDefaults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNodeId() throws Exception {
         String url = URL_PREFIX + HOST + "/?nodeId=" + grid(0).localNode().id();
 
@@ -119,6 +124,7 @@ public void testNodeId() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCustomCache() throws Exception {
         String url = URL_PREFIX + HOST + "/" + CUSTOM_CACHE_NAME;
 
@@ -128,6 +134,7 @@ public void testCustomCache() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCustomPort() throws Exception {
         String url = URL_PREFIX + HOST + ":" + CUSTOM_PORT;
 
@@ -138,6 +145,7 @@ public void testCustomPort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCustomCacheNameAndPort() throws Exception {
         String url = URL_PREFIX + HOST + ":" + CUSTOM_PORT + "/" + CUSTOM_CACHE_NAME;
 
@@ -147,6 +155,7 @@ public void testCustomCacheNameAndPort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testWrongCache() throws Exception {
         final String url = URL_PREFIX + HOST + "/wrongCacheName";
 
@@ -167,6 +176,7 @@ public void testWrongCache() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testWrongPort() throws Exception {
         final String url = URL_PREFIX + HOST + ":33333";
 
@@ -187,6 +197,7 @@ public void testWrongPort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClose() throws Exception {
         String url = URL_PREFIX + HOST;
 
@@ -212,4 +223,4 @@ public void testClose() throws Exception {
             "Connection is closed."
         );
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcEmptyCacheSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcEmptyCacheSelfTest.java
index 897f71e11cbc..b5b1055289e1 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcEmptyCacheSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcEmptyCacheSelfTest.java
@@ -27,6 +27,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -34,6 +37,7 @@
 /**
  * Tests for empty cache.
  */
+@RunWith(JUnit4.class)
 public class JdbcEmptyCacheSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -100,6 +104,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelectNumber() throws Exception {
         ResultSet rs = stmt.executeQuery("select 1");
 
@@ -118,6 +123,7 @@ public void testSelectNumber() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelectString() throws Exception {
         ResultSet rs = stmt.executeQuery("select 'str'");
 
@@ -131,4 +137,4 @@ public void testSelectString() throws Exception {
 
         assert cnt == 1;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcErrorsAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcErrorsAbstractSelfTest.java
index c44e00725731..0f7c6c1fdb2c 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcErrorsAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcErrorsAbstractSelfTest.java
@@ -41,10 +41,14 @@
 import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test SQLSTATE codes propagation with (any) Ignite JDBC driver.
  */
+@RunWith(JUnit4.class)
 public abstract class JdbcErrorsAbstractSelfTest extends GridCommonAbstractTest {
     /** */
     protected static final String CACHE_STORE_TEMPLATE = "cache_store";
@@ -73,6 +77,7 @@
      * Test that H2 specific error codes get propagated to Ignite SQL exceptions.
      * @throws SQLException if failed.
      */
+    @Test
     public void testParsingErrors() throws SQLException {
         checkErrorState("gibberish", "42000",
             "Failed to parse query. Syntax error in SQL statement \"GIBBERISH[*] \"");
@@ -82,6 +87,7 @@ public void testParsingErrors() throws SQLException {
      * Test that error codes from tables related DDL operations get propagated to Ignite SQL exceptions.
      * @throws SQLException if failed.
      */
+    @Test
     public void testTableErrors() throws SQLException {
         checkErrorState("DROP TABLE \"PUBLIC\".missing", "42000", "Table doesn't exist: MISSING");
     }
@@ -90,6 +96,7 @@ public void testTableErrors() throws SQLException {
      * Test that error codes from indexes related DDL operations get propagated to Ignite SQL exceptions.
      * @throws SQLException if failed.
      */
+    @Test
     public void testIndexErrors() throws SQLException {
         checkErrorState("DROP INDEX \"PUBLIC\".missing", "42000", "Index doesn't exist: MISSING");
     }
@@ -98,6 +105,7 @@ public void testIndexErrors() throws SQLException {
      * Test that error codes from DML operations get propagated to Ignite SQL exceptions.
      * @throws SQLException if failed.
      */
+    @Test
     public void testDmlErrors() throws SQLException {
         checkErrorState("INSERT INTO \"test\".INTEGER(_key, _val) values(1, null)", "22004",
             "Value for INSERT, COPY, MERGE, or UPDATE must not be null");
@@ -110,6 +118,7 @@ public void testDmlErrors() throws SQLException {
      * Test error code for the case when user attempts to refer a future currently unsupported.
      * @throws SQLException if failed.
      */
+    @Test
     public void testUnsupportedSql() throws SQLException {
         checkErrorState("ALTER TABLE \"test\".Integer MODIFY COLUMN _key CHAR", "0A000",
             "ALTER COLUMN is not supported");
@@ -119,6 +128,7 @@ public void testUnsupportedSql() throws SQLException {
      * Test error code for the case when user attempts to use a closed connection.
      * @throws SQLException if failed.
      */
+    @Test
     public void testConnectionClosed() throws SQLException {
         checkErrorState(new IgniteCallable<Void>() {
             @Override public Void call() throws Exception {
@@ -231,6 +241,7 @@ public void testConnectionClosed() throws SQLException {
      * Test error code for the case when user attempts to use a closed result set.
      * @throws SQLException if failed.
      */
+    @Test
     public void testResultSetClosed() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -252,6 +263,7 @@ public void testResultSetClosed() throws SQLException {
      * from column whose value can't be converted to an {@code int}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidIntFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -271,6 +283,7 @@ public void testInvalidIntFormat() throws SQLException {
      * from column whose value can't be converted to an {@code long}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidLongFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -290,6 +303,7 @@ public void testInvalidLongFormat() throws SQLException {
      * from column whose value can't be converted to an {@code float}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidFloatFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -309,6 +323,7 @@ public void testInvalidFloatFormat() throws SQLException {
      * from column whose value can't be converted to an {@code double}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidDoubleFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -328,6 +343,7 @@ public void testInvalidDoubleFormat() throws SQLException {
      * from column whose value can't be converted to an {@code byte}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidByteFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -347,6 +363,7 @@ public void testInvalidByteFormat() throws SQLException {
      * from column whose value can't be converted to an {@code short}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidShortFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -366,6 +383,7 @@ public void testInvalidShortFormat() throws SQLException {
      * from column whose value can't be converted to an {@code BigDecimal}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidBigDecimalFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -385,6 +403,7 @@ public void testInvalidBigDecimalFormat() throws SQLException {
      * from column whose value can't be converted to an {@code boolean}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidBooleanFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -404,6 +423,7 @@ public void testInvalidBooleanFormat() throws SQLException {
      * from column whose value can't be converted to an {@code boolean}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidObjectFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -423,6 +443,7 @@ public void testInvalidObjectFormat() throws SQLException {
      * from column whose value can't be converted to a {@link Date}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidDateFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -442,6 +463,7 @@ public void testInvalidDateFormat() throws SQLException {
      * from column whose value can't be converted to a {@link Time}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidTimeFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -461,6 +483,7 @@ public void testInvalidTimeFormat() throws SQLException {
      * from column whose value can't be converted to a {@link Timestamp}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidTimestampFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -480,6 +503,7 @@ public void testInvalidTimestampFormat() throws SQLException {
      * from column whose value can't be converted to a {@link URL}.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidUrlFormat() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -499,6 +523,7 @@ public void testInvalidUrlFormat() throws SQLException {
      *
      * @throws SQLException if failed.
      */
+    @Test
     public void testNotNullViolation() throws SQLException {
         try (Connection conn = getConnection()) {
             conn.setSchema("PUBLIC");
@@ -528,6 +553,7 @@ public void testNotNullViolation() throws SQLException {
      *
      * @throws SQLException if failed.
      */
+    @Test
     public void testNotNullRestrictionReadThroughCacheStore() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -548,6 +574,7 @@ public void testNotNullRestrictionReadThroughCacheStore() throws SQLException {
      *
      * @throws SQLException if failed.
      */
+    @Test
     public void testNotNullRestrictionCacheInterceptor() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -566,6 +593,7 @@ public void testNotNullRestrictionCacheInterceptor() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testSelectWrongTable() throws SQLException {
         checkSqlErrorMessage("select from wrong", "42000",
             "Failed to parse query. Table \"WRONG\" not found");
@@ -576,6 +604,7 @@ public void testSelectWrongTable() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testSelectWrongColumnName() throws SQLException {
         checkSqlErrorMessage("select wrong from test", "42000",
             "Failed to parse query. Column \"WRONG\" not found");
@@ -586,6 +615,7 @@ public void testSelectWrongColumnName() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testSelectWrongSyntax() throws SQLException {
         checkSqlErrorMessage("select from test where", "42000",
             "Failed to parse query. Syntax error in SQL statement \"SELECT FROM TEST WHERE[*]");
@@ -596,6 +626,7 @@ public void testSelectWrongSyntax() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDmlWrongTable() throws SQLException {
         checkSqlErrorMessage("insert into wrong (id, val) values (3, 'val3')", "42000",
             "Failed to parse query. Table \"WRONG\" not found");
@@ -615,6 +646,7 @@ public void testDmlWrongTable() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDmlWrongColumnName() throws SQLException {
         checkSqlErrorMessage("insert into test (id, wrong) values (3, 'val3')", "42000",
             "Failed to parse query. Column \"WRONG\" not found");
@@ -634,6 +666,7 @@ public void testDmlWrongColumnName() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDmlWrongSyntax() throws SQLException {
         checkSqlErrorMessage("insert test (id, val) values (3, 'val3')", "42000",
             "Failed to parse query. Syntax error in SQL statement \"INSERT TEST[*] (ID, VAL)");
@@ -653,6 +686,7 @@ public void testDmlWrongSyntax() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDdlWrongTable() throws SQLException {
         checkSqlErrorMessage("create table test (id int primary key, val varchar)", "42000",
             "Table already exists: TEST");
@@ -675,6 +709,7 @@ public void testDdlWrongTable() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDdlWrongColumnName() throws SQLException {
         checkSqlErrorMessage("create index idx1 on test (wrong)", "42000",
             "Column doesn't exist: WRONG");
@@ -688,6 +723,7 @@ public void testDdlWrongColumnName() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDdlWrongSyntax() throws SQLException {
         checkSqlErrorMessage("create table test2 (id int wrong key, val varchar)", "42000",
             "Failed to parse query. Syntax error in SQL statement \"CREATE TABLE TEST2 (ID INT WRONG[*]");
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcLocalCachesSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcLocalCachesSelfTest.java
index 9350e0d59724..64594483355c 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcLocalCachesSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcLocalCachesSelfTest.java
@@ -29,6 +29,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.PROP_NODE_ID;
 import static org.apache.ignite.cache.CacheMode.LOCAL;
@@ -37,6 +40,7 @@
 /**
  * Test JDBC with several local caches.
  */
+@RunWith(JUnit4.class)
 public class JdbcLocalCachesSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -95,6 +99,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCache1() throws Exception {
         Properties cfg = new Properties();
 
@@ -123,6 +128,7 @@ public void testCache1() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCache2() throws Exception {
         Properties cfg = new Properties();
 
@@ -147,4 +153,4 @@ public void testCache2() throws Exception {
                 conn.close();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcMetadataSelfTest.java
index f270910a7794..18e29b6013ad 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcMetadataSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcMetadataSelfTest.java
@@ -38,6 +38,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Types.INTEGER;
 import static java.sql.Types.OTHER;
@@ -48,6 +51,7 @@
 /**
  * Metadata tests.
  */
+@RunWith(JUnit4.class)
 public class JdbcMetadataSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -108,6 +112,7 @@ protected CacheConfiguration cacheConfiguration() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testResultSetMetaData() throws Exception {
         Statement stmt = DriverManager.getConnection(URL).createStatement();
 
@@ -176,6 +181,7 @@ public void testGetTables() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetColumns() throws Exception {
         final boolean primitivesInformationIsLostAfterStore = ignite(0).configuration().getMarshaller() instanceof BinaryMarshaller;
         try (Connection conn = DriverManager.getConnection(URL)) {
@@ -269,6 +275,7 @@ public void testGetColumns() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetadataResultSetClose() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL);
              ResultSet tbls = conn.getMetaData().getTables(null, null, "%", null)) {
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcNoDefaultCacheTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcNoDefaultCacheTest.java
index adb5c306aeb9..5fcb7b3f6508 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcNoDefaultCacheTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcNoDefaultCacheTest.java
@@ -31,10 +31,14 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcNoDefaultCacheTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -109,6 +113,7 @@ protected String getUrl() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDefaults() throws Exception {
         String url = getUrl();
 
@@ -124,6 +129,7 @@ public void testDefaults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNoCacheNameQuery() throws Exception {
         Statement stmt;
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoLegacyQuerySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoLegacyQuerySelfTest.java
index 4fa7ba544387..4f63caf8bd2b 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoLegacyQuerySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoLegacyQuerySelfTest.java
@@ -18,10 +18,14 @@
 package org.apache.ignite.jdbc;
 
 import java.sql.ResultSet;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test for Jdbc driver query without class on client
  */
+@RunWith(JUnit4.class)
 public class JdbcPojoLegacyQuerySelfTest extends AbstractJdbcPojoQuerySelfTest {
     /** URL. */
     private static final String URL = "jdbc:ignite://127.0.0.1/";
@@ -29,6 +33,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJdbcQuery() throws Exception {
         stmt.execute("select * from JdbcTestObject");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoQuerySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoQuerySelfTest.java
index 6729d0491c67..31ac22f8206d 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoQuerySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPojoQuerySelfTest.java
@@ -18,12 +18,16 @@
 package org.apache.ignite.jdbc;
 
 import java.sql.ResultSet;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
 
 /**
  * Test for Jdbc driver query without class on client
  */
+@RunWith(JUnit4.class)
 public class JdbcPojoQuerySelfTest extends AbstractJdbcPojoQuerySelfTest {
     /** URL. */
     private static final String URL = CFG_URL_PREFIX + "cache=default@modules/clients/src/test/config/jdbc-bin-config.xml";
@@ -31,6 +35,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJdbcQueryTask2() throws Exception {
         stmt.execute("select * from JdbcTestObject");
 
@@ -42,6 +47,7 @@ public void testJdbcQueryTask2() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJdbcQueryTask1() throws Exception {
         ResultSet rs = stmt.executeQuery("select * from JdbcTestObject");
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPreparedStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPreparedStatementSelfTest.java
index 9bdb7d804b2a..d2c5162f5367 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPreparedStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcPreparedStatementSelfTest.java
@@ -36,6 +36,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Types.BIGINT;
 import static java.sql.Types.BINARY;
@@ -57,6 +60,7 @@
 /**
  * Prepared statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcPreparedStatementSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -151,6 +155,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRepeatableUsage() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where id = ?");
 
@@ -186,6 +191,7 @@ public void testRepeatableUsage() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where boolVal is not distinct from ?");
 
@@ -223,6 +229,7 @@ public void testBoolean() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testByte() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where byteVal is not distinct from ?");
 
@@ -260,6 +267,7 @@ public void testByte() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShort() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where shortVal is not distinct from ?");
 
@@ -297,6 +305,7 @@ public void testShort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInteger() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where intVal is not distinct from ?");
 
@@ -334,6 +343,7 @@ public void testInteger() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLong() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where longVal is not distinct from ?");
 
@@ -371,6 +381,7 @@ public void testLong() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFloat() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where floatVal is not distinct from ?");
 
@@ -408,6 +419,7 @@ public void testFloat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDouble() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where doubleVal is not distinct from ?");
 
@@ -445,6 +457,7 @@ public void testDouble() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimal() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where bigVal is not distinct from ?");
 
@@ -482,6 +495,7 @@ public void testBigDecimal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testString() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where strVal is not distinct from ?");
 
@@ -519,6 +533,7 @@ public void testString() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testArray() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where arrVal is not distinct from ?");
 
@@ -556,6 +571,7 @@ public void testArray() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDate() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where dateVal is not distinct from ?");
 
@@ -593,6 +609,7 @@ public void testDate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTime() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where timeVal is not distinct from ?");
 
@@ -630,6 +647,7 @@ public void testTime() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimestamp() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where tsVal is not distinct from ?");
 
@@ -667,6 +685,7 @@ public void testTimestamp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUrl() throws Exception {
         stmt = conn.prepareStatement("select * from TestObject where urlVal is not distinct from ?");
 
@@ -773,4 +792,4 @@ private TestObject(int id) {
             this.id = id;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcResultSetSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcResultSetSelfTest.java
index 0fe55f2b0a63..5fe8f53807b0 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcResultSetSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcResultSetSelfTest.java
@@ -44,6 +44,9 @@
 import java.util.Arrays;
 import java.util.Objects;
 import java.util.concurrent.Callable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -52,6 +55,7 @@
  * Result set test.
  */
 @SuppressWarnings("FloatingPointEquality")
+@RunWith(JUnit4.class)
 public class JdbcResultSetSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -156,6 +160,7 @@ private TestObject createObjectWithData(int id) throws MalformedURLException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -176,6 +181,7 @@ public void testBoolean() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testByte() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -196,6 +202,7 @@ public void testByte() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShort() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -216,6 +223,7 @@ public void testShort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInteger() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -236,6 +244,7 @@ public void testInteger() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLong() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -256,6 +265,7 @@ public void testLong() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFloat() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -276,6 +286,7 @@ public void testFloat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDouble() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -296,6 +307,7 @@ public void testDouble() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimal() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -316,6 +328,7 @@ public void testBigDecimal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testString() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -336,6 +349,7 @@ public void testString() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testArray() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -357,6 +371,7 @@ public void testArray() throws Exception {
      * @throws Exception If failed.
      */
     @SuppressWarnings("deprecation")
+    @Test
     public void testDate() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -378,6 +393,7 @@ public void testDate() throws Exception {
      * @throws Exception If failed.
      */
     @SuppressWarnings("deprecation")
+    @Test
     public void testTime() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -398,6 +414,7 @@ public void testTime() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimestamp() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -418,6 +435,7 @@ public void testTimestamp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUrl() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -507,6 +525,7 @@ private static String removeIdHash(String str) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testObject() throws Exception {
         final Ignite ignite = ignite(0);
         final boolean binaryMarshaller = ignite.configuration().getMarshaller() instanceof BinaryMarshaller;
@@ -541,6 +560,7 @@ public void testObject() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNavigation() throws Exception {
         ResultSet rs = stmt.executeQuery("select * from TestObject where id > 0");
 
@@ -578,6 +598,7 @@ public void testNavigation() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFindColumn() throws Exception {
         final ResultSet rs = stmt.executeQuery(SQL);
 
@@ -790,4 +811,4 @@ private TestObjectField(int a, String b) {
             return S.toString(TestObjectField.class, this);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcStatementSelfTest.java
index 4d72b8e19720..65d61a6f31f6 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcStatementSelfTest.java
@@ -32,6 +32,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -39,6 +42,7 @@
 /**
  * Statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcStatementSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -117,6 +121,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecuteQuery() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -149,6 +154,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExecute() throws Exception {
         assert stmt.execute(SQL);
 
@@ -185,6 +191,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMaxRows() throws Exception {
         stmt.setMaxRows(1);
 
@@ -283,4 +290,4 @@ private Person(int id, String firstName, String lastName, int age) {
             this.age = age;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcVersionMismatchSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcVersionMismatchSelfTest.java
new file mode 100644
index 000000000000..19a1be60bfc4
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcVersionMismatchSelfTest.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.jdbc;
+
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
+import org.apache.ignite.internal.processors.odbc.SqlStateCode;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * JDBC version mismatch test.
+ */
+@RunWith(JUnit4.class)
+public class JdbcVersionMismatchSelfTest extends GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        startGrid();
+
+        try (Connection conn = connect()) {
+            executeUpdate(conn,
+                "CREATE TABLE test (a INT PRIMARY KEY, b INT, c VARCHAR) WITH \"atomicity=TRANSACTIONAL_SNAPSHOT, cache_name=TEST\"");
+
+            executeUpdate(conn, "INSERT INTO test VALUES (1, 1, 'test_1')");
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testVersionMismatchJdbc() throws Exception {
+        try (Connection conn1 = connect(); Connection conn2 = connect()) {
+            conn1.setAutoCommit(false);
+            conn2.setAutoCommit(false);
+
+            // Start first transaction and observe some values.
+            assertEquals(1, executeQuery(conn1, "SELECT * FROM test").size());
+
+            // Change values while first transaction is still in progress.
+            executeUpdate(conn2, "INSERT INTO test VALUES (2, 2, 'test_2')");
+            executeUpdate(conn2, "COMMIT");
+            assertEquals(2, executeQuery(conn2, "SELECT * FROM test").size());
+
+            // Force version mismatch.
+            try {
+                executeUpdate(conn1, "INSERT INTO test VALUES (2, 2, 'test_2')");
+
+                fail();
+            }
+            catch (SQLException e) {
+                assertEquals(SqlStateCode.SERIALIZATION_FAILURE, e.getSQLState());
+                assertEquals(IgniteQueryErrorCode.TRANSACTION_SERIALIZATION_ERROR, e.getErrorCode());
+
+                assertNotNull(e.getMessage());
+                assertTrue(e.getMessage().contains("Cannot serialize transaction due to write conflict"));
+            }
+
+            // Subsequent call should cause exception due to TX being rolled back.
+            try {
+                executeQuery(conn1, "SELECT * FROM test").size();
+
+                fail();
+            }
+            catch (SQLException e) {
+                assertEquals(SqlStateCode.TRANSACTION_STATE_EXCEPTION, e.getSQLState());
+                assertEquals(IgniteQueryErrorCode.TRANSACTION_COMPLETED, e.getErrorCode());
+
+                assertNotNull(e.getMessage());
+                assertTrue(e.getMessage().contains("Transaction is already completed"));
+            }
+
+            // Commit should fail.
+            try {
+                conn1.commit();
+
+                fail();
+            }
+            catch (SQLException e) {
+                // Cannot pass proper error codes for now
+                assertEquals(SqlStateCode.INTERNAL_ERROR, e.getSQLState());
+                assertEquals(IgniteQueryErrorCode.UNKNOWN, e.getErrorCode());
+
+                assertNotNull(e.getMessage());
+                assertTrue(e.getMessage().contains("Failed to finish transaction because it has been rolled back"));
+            }
+
+            // Rollback should work.
+            conn1.rollback();
+
+            // Subsequent calls should work fine.
+            assertEquals(2, executeQuery(conn2, "SELECT * FROM test").size());
+        }
+    }
+
+    /**
+     * Establish JDBC connection.
+     *
+     * @return Connection.
+     * @throws Exception If failed.
+     */
+    private Connection connect() throws Exception {
+        return DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");
+    }
+
+    /**
+     * Execute update statement.
+     *
+     * @param conn Connection.
+     * @param sql SQL.
+     * @throws Exception If failed.
+     */
+    private static void executeUpdate(Connection conn, String sql) throws Exception {
+        try (Statement stmt = conn.createStatement()) {
+            stmt.executeUpdate(sql);
+        }
+    }
+
+    /**
+     * Execute query.
+     *
+     * @param conn Connection.
+     * @param sql SQL.
+     * @return Result.
+     * @throws Exception If failed.
+     */
+    private static List<List<Object>> executeQuery(Connection conn, String sql) throws Exception {
+        List<List<Object>> rows = new ArrayList<>();
+
+        try (Statement stmt = conn.createStatement()) {
+            try (ResultSet rs = stmt.executeQuery(sql)) {
+                int colCnt = rs.getMetaData().getColumnCount();
+
+                while (rs.next()) {
+                    List<Object> row = new ArrayList<>(colCnt);
+
+                    for (int i = 0; i < colCnt; i++)
+                        row.add(rs.getObject(i + 1));
+
+                    rows.add(row);
+                }
+            }
+        }
+
+        return rows;
+    }
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverMvccTestSuite.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverMvccTestSuite.java
index 6d8933dfe143..f89bc44dcc2a 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverMvccTestSuite.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverMvccTestSuite.java
@@ -17,30 +17,38 @@
 
 package org.apache.ignite.jdbc.suite;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
+import org.apache.ignite.jdbc.JdbcVersionMismatchSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinConnectionMvccEnabledSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinTransactionsClientAutoCommitComplexSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinTransactionsClientNoAutoCommitComplexSelfTest;
-import org.apache.ignite.jdbc.thin.JdbcThinTransactionsWithMvccEnabledSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinTransactionsServerAutoCommitComplexSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinTransactionsServerNoAutoCommitComplexSelfTest;
+import org.apache.ignite.jdbc.thin.JdbcThinTransactionsWithMvccEnabledSelfTest;
+import org.apache.ignite.jdbc.thin.MvccJdbcTransactionFinishOnDeactivatedClusterSelfTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
-public class IgniteJdbcDriverMvccTestSuite extends TestSuite {
+/** */
+@RunWith(AllTests.class)
+public class IgniteJdbcDriverMvccTestSuite {
     /**
      * @return JDBC Driver Test Suite.
-     * @throws Exception In case of error.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new TestSuite("Ignite JDBC Driver Test Suite");
 
-        suite.addTest(new TestSuite(JdbcThinConnectionMvccEnabledSelfTest.class));
-        
+        suite.addTest(new JUnit4TestAdapter(JdbcThinConnectionMvccEnabledSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcVersionMismatchSelfTest.class));
+
         // Transactions
-        suite.addTest(new TestSuite(JdbcThinTransactionsWithMvccEnabledSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsClientAutoCommitComplexSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsServerAutoCommitComplexSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsClientNoAutoCommitComplexSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsServerNoAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsWithMvccEnabledSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsClientAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsServerAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsClientNoAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsServerNoAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(MvccJdbcTransactionFinishOnDeactivatedClusterSelfTest.class));
 
         return suite;
     }
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
index 2e98d689deaa..977feed61813 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.jdbc.suite;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.internal.jdbc2.JdbcBlobTest;
 import org.apache.ignite.internal.jdbc2.JdbcBulkLoadSelfTest;
@@ -66,6 +67,7 @@
 import org.apache.ignite.jdbc.thin.JdbcThinLocalQueriesSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinMergeStatementSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinMergeStatementSkipReducerOnUpdateSelfTest;
+import org.apache.ignite.jdbc.thin.JdbcThinMetadataPrimaryKeysSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinMetadataSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinMissingLongArrayResultsTest;
 import org.apache.ignite.jdbc.thin.JdbcThinNoDefaultSchemaTest;
@@ -85,137 +87,140 @@
 import org.apache.ignite.jdbc.thin.JdbcThinUpdateStatementSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinUpdateStatementSkipReducerOnUpdateSelfTest;
 import org.apache.ignite.jdbc.thin.JdbcThinWalModeChangeSelfTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 /**
  * JDBC driver test suite.
  */
-public class IgniteJdbcDriverTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteJdbcDriverTestSuite {
     /**
      * @return JDBC Driver Test Suite.
-     * @throws Exception In case of error.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new TestSuite("Ignite JDBC Driver Test Suite");
 
         // Thin client based driver tests.
-        suite.addTest(new TestSuite(JdbcConnectionSelfTest.class));
-        suite.addTest(new TestSuite(JdbcStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcPreparedStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcResultSetSelfTest.class));
-        suite.addTest(new TestSuite(JdbcComplexQuerySelfTest.class));
-        suite.addTest(new TestSuite(JdbcMetadataSelfTest.class));
-        suite.addTest(new TestSuite(JdbcEmptyCacheSelfTest.class));
-        suite.addTest(new TestSuite(JdbcLocalCachesSelfTest.class));
-        suite.addTest(new TestSuite(JdbcNoDefaultCacheTest.class));
-        suite.addTest(new TestSuite(JdbcDefaultNoOpCacheTest.class));
-        suite.addTest(new TestSuite(JdbcPojoQuerySelfTest.class));
-        suite.addTest(new TestSuite(JdbcPojoLegacyQuerySelfTest.class));
-        suite.addTest(new TestSuite(JdbcConnectionReopenTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcConnectionSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcPreparedStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcResultSetSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcComplexQuerySelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcMetadataSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcEmptyCacheSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcLocalCachesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcNoDefaultCacheTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcDefaultNoOpCacheTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcPojoQuerySelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcPojoLegacyQuerySelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcConnectionReopenTest.class));
 
         // Ignite client node based driver tests
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcConnectionSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcSpringSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcPreparedStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcResultSetSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcComplexQuerySelfTest.class));
-        suite.addTest(new TestSuite(JdbcDistributedJoinsQueryTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcMetadataSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcEmptyCacheSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcLocalCachesSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcNoDefaultCacheTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDefaultNoOpCacheTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcMergeStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerMergeStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcUpdateStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcInsertStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerInsertStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDeleteStatementSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStatementBatchingSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcErrorsSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStreamingToPublicCacheTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcNoCacheStreamingSelfTest.class));
-        suite.addTest(new TestSuite(JdbcBulkLoadSelfTest.class));
-
-        suite.addTest(new TestSuite(JdbcBlobTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStreamingSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinStreamingNotOrderedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinStreamingOrderedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcConnectionSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcSpringSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcPreparedStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcResultSetSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcComplexQuerySelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcDistributedJoinsQueryTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcMetadataSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcEmptyCacheSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcLocalCachesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcNoDefaultCacheTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDefaultNoOpCacheTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcMergeStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerMergeStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcUpdateStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcInsertStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerInsertStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDeleteStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcStatementBatchingSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcErrorsSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcStreamingToPublicCacheTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcNoCacheStreamingSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcBulkLoadSelfTest.class));
+
+        suite.addTest(new JUnit4TestAdapter(JdbcBlobTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcStreamingSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinStreamingNotOrderedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinStreamingOrderedSelfTest.class));
 
         // DDL tests.
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedNearSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicReplicatedSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedNearSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedSelfTest.class));
-        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalReplicatedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedNearSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicReplicatedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedNearSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalReplicatedSelfTest.class));
 
         // New thin JDBC
-        suite.addTest(new TestSuite(JdbcThinConnectionSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinConnectionMvccEnabledSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinConnectionMultipleAddressesTest.class));
-        suite.addTest(new TestSuite(JdbcThinTcpIoTest.class));
-        suite.addTest(new TestSuite(JdbcThinConnectionSSLTest.class));
-        suite.addTest(new TestSuite(JdbcThinDataSourceSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinPreparedStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinResultSetSelfTest.class));
-
-        suite.addTest(new TestSuite(JdbcThinStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinComplexQuerySelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinNoDefaultSchemaTest.class));
-        suite.addTest(new TestSuite(JdbcThinSchemaCaseTest.class));
-        suite.addTest(new TestSuite(JdbcThinEmptyCacheSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinMetadataSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinErrorsSelfTest.class));
-
-        suite.addTest(new TestSuite(JdbcThinInsertStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinUpdateStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinMergeStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinDeleteStatementSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinAutoCloseServerCursorTest.class));
-        suite.addTest(new TestSuite(JdbcThinBatchSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinMissingLongArrayResultsTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinConnectionSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinConnectionMvccEnabledSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinConnectionMultipleAddressesTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTcpIoTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinConnectionSSLTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDataSourceSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinPreparedStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinResultSetSelfTest.class));
+
+        suite.addTest(new JUnit4TestAdapter(JdbcThinStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinComplexQuerySelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinNoDefaultSchemaTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinSchemaCaseTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinEmptyCacheSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinMetadataSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinMetadataPrimaryKeysSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinErrorsSelfTest.class));
+
+        suite.addTest(new JUnit4TestAdapter(JdbcThinInsertStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinUpdateStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinMergeStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDeleteStatementSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinAutoCloseServerCursorTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBatchSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinMissingLongArrayResultsTest.class));
 
         // New thin JDBC driver, DDL tests
-        suite.addTest(new TestSuite(JdbcThinDynamicIndexAtomicPartitionedNearSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinDynamicIndexAtomicPartitionedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinDynamicIndexAtomicReplicatedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinDynamicIndexTransactionalPartitionedNearSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinDynamicIndexTransactionalPartitionedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinDynamicIndexTransactionalReplicatedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDynamicIndexAtomicPartitionedNearSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDynamicIndexAtomicPartitionedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDynamicIndexAtomicReplicatedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDynamicIndexTransactionalPartitionedNearSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDynamicIndexTransactionalPartitionedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinDynamicIndexTransactionalReplicatedSelfTest.class));
 
         // New thin JDBC driver, DML tests
-        suite.addTest(new TestSuite(JdbcThinBulkLoadAtomicPartitionedNearSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinBulkLoadAtomicPartitionedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinBulkLoadAtomicReplicatedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinBulkLoadTransactionalPartitionedNearSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinBulkLoadTransactionalPartitionedSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinBulkLoadTransactionalReplicatedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBulkLoadAtomicPartitionedNearSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBulkLoadAtomicPartitionedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBulkLoadAtomicReplicatedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBulkLoadTransactionalPartitionedNearSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBulkLoadTransactionalPartitionedSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinBulkLoadTransactionalReplicatedSelfTest.class));
 
         // New thin JDBC driver, full SQL tests
-        suite.addTest(new TestSuite(JdbcThinComplexDmlDdlSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinComplexDmlDdlSelfTest.class));
 
-        suite.addTest(new TestSuite(JdbcThinSelectAfterAlterTable.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinSelectAfterAlterTable.class));
 
         // Update on server
-        suite.addTest(new TestSuite(JdbcThinInsertStatementSkipReducerOnUpdateSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinUpdateStatementSkipReducerOnUpdateSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinMergeStatementSkipReducerOnUpdateSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinComplexDmlDdlSkipReducerOnUpdateSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinComplexDmlDdlCustomSchemaSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinInsertStatementSkipReducerOnUpdateSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinUpdateStatementSkipReducerOnUpdateSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinMergeStatementSkipReducerOnUpdateSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinComplexDmlDdlSkipReducerOnUpdateSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinComplexDmlDdlCustomSchemaSelfTest.class));
 
         // Transactions
-        suite.addTest(new TestSuite(JdbcThinTransactionsSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsClientAutoCommitComplexSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsServerAutoCommitComplexSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsClientNoAutoCommitComplexSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinTransactionsServerNoAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsClientAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsServerAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsClientNoAutoCommitComplexSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinTransactionsServerNoAutoCommitComplexSelfTest.class));
 
-        suite.addTest(new TestSuite(JdbcThinLocalQueriesSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinLocalQueriesSelfTest.class));
 
         // Various commands.
-        suite.addTest(new TestSuite(JdbcThinWalModeChangeSelfTest.class));
-        suite.addTest(new TestSuite(JdbcThinAuthenticateConnectionSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinWalModeChangeSelfTest.class));
+        suite.addTest(new JUnit4TestAdapter(JdbcThinAuthenticateConnectionSelfTest.class));
 
         return suite;
     }
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAuthenticateConnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAuthenticateConnectionSelfTest.java
index cb4d7f3cf70c..ee4a62f39b96 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAuthenticateConnectionSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAuthenticateConnectionSelfTest.java
@@ -31,11 +31,15 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for authenticated an non authenticated JDBC thin connection.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinAuthenticateConnectionSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -93,6 +97,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testConnection() throws Exception {
         checkConnection(URL, "ignite", "ignite");
         checkConnection(URL, "another_user", "passwd");
@@ -102,6 +107,7 @@ public void testConnection() throws Exception {
 
     /**
      */
+    @Test
     public void testInvalidUserPassword() {
         String err = "Unauthenticated sessions are prohibited";
         checkInvalidUserPassword(URL, null, null, err);
@@ -119,6 +125,7 @@ public void testInvalidUserPassword() {
     /**
      * @throws SQLException On failed.
      */
+    @Test
     public void testUserSqlOnAuthorized() throws SQLException {
         try (Connection conn = DriverManager.getConnection(URL, "ignite", "ignite")) {
             conn.createStatement().execute("CREATE USER test WITH PASSWORD 'test'");
@@ -139,6 +146,7 @@ public void testUserSqlOnAuthorized() throws SQLException {
     /**
      * @throws SQLException On error.
      */
+    @Test
     public void testUserSqlWithNotIgniteUser() throws SQLException {
         try (Connection conn = DriverManager.getConnection(URL, "another_user", "passwd")) {
             String err = "User management operations are not allowed for user";
@@ -157,6 +165,7 @@ public void testUserSqlWithNotIgniteUser() throws SQLException {
     /**
      * @throws SQLException On error.
      */
+    @Test
     public void testQuotedUsername() throws SQLException {
         // Spaces
         checkUserPassword(" test", "    ");
@@ -235,4 +244,4 @@ private void checkUnauthorizedOperation(final Connection conn, final String sql,
             }
         }, SQLException.class, err);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAutoCloseServerCursorTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAutoCloseServerCursorTest.java
index bb2696f570cc..f3d19aea5a2e 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAutoCloseServerCursorTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinAutoCloseServerCursorTest.java
@@ -34,6 +34,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -42,6 +45,7 @@
  * Tests an optional optimization that server cursor is closed automatically
  * when last result set page is transmitted.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinAutoCloseServerCursorTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -95,7 +99,7 @@
      *
      * @throws Exception If failed.
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testQuery() throws Exception {
         IgniteCache<Integer, Person> cache = grid(0).cache(CACHE_NAME);
 
@@ -189,6 +193,7 @@ public void testQuery() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testInsert() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             conn.setSchema('"' + CACHE_NAME + '"');
@@ -218,6 +223,7 @@ public void testInsert() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testUpdate() throws Exception {
         IgniteCache<Integer, Person> cache = grid(0).cache(CACHE_NAME);
 
@@ -243,6 +249,7 @@ public void testUpdate() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testDelete() throws Exception {
         IgniteCache<Integer, Person> cache = grid(0).cache(CACHE_NAME);
 
@@ -288,7 +295,6 @@ private void checkResultSet(ResultSet rs, Person[] persons) throws Exception {
     /**
      * Person.
      */
-    @SuppressWarnings("UnusedDeclaration")
     static class Person implements Serializable {
         /** ID. */
         @QuerySqlField
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBatchSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBatchSelfTest.java
index fe7c17072959..376ec1d648f0 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBatchSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBatchSelfTest.java
@@ -26,12 +26,16 @@
 import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
 import org.apache.ignite.internal.processors.odbc.SqlStateCode;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.junit.Assert.assertArrayEquals;
 
 /**
  * Statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinBatchSelfTest extends JdbcThinAbstractDmlStatementSelfTest {
     /** SQL query. */
     private static final String SQL_PREPARED = "insert into Person(_key, id, firstName, lastName, age) values " +
@@ -75,6 +79,7 @@
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatch() throws SQLException {
         final int BATCH_SIZE = 10;
 
@@ -94,6 +99,7 @@ public void testBatch() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchOnClosedStatement() throws SQLException {
         final Statement stmt2 = conn.createStatement();
         final PreparedStatement pstmt2 = conn.prepareStatement("");
@@ -153,6 +159,7 @@ public void testBatchOnClosedStatement() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchException() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -195,6 +202,7 @@ public void testBatchException() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchParseException() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -237,6 +245,7 @@ public void testBatchParseException() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchMerge() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -256,6 +265,7 @@ public void testBatchMerge() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchMergeParseException() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -295,10 +305,10 @@ public void testBatchMergeParseException() throws SQLException {
         }
     }
 
-
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchKeyDuplicatesException() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -343,6 +353,7 @@ public void testBatchKeyDuplicatesException() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testHeterogeneousBatch() throws SQLException {
         stmt.addBatch("insert into Person (_key, id, firstName, lastName, age) values ('p0', 0, 'Name0', 'Lastname0', 10)");
         stmt.addBatch("insert into Person (_key, id, firstName, lastName, age) values ('p1', 1, 'Name1', 'Lastname1', 20), ('p2', 2, 'Name2', 'Lastname2', 30)");
@@ -360,6 +371,7 @@ public void testHeterogeneousBatch() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testHeterogeneousBatchException() throws SQLException {
         stmt.addBatch("insert into Person (_key, id, firstName, lastName, age) values ('p0', 0, 'Name0', 'Lastname0', 10)");
         stmt.addBatch("insert into Person (_key, id, firstName, lastName, age) values ('p1', 1, 'Name1', 'Lastname1', 20), ('p2', 2, 'Name2', 'Lastname2', 30)");
@@ -390,6 +402,7 @@ public void testHeterogeneousBatchException() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchClear() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -412,6 +425,7 @@ public void testBatchClear() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchPrepared() throws SQLException {
         final int BATCH_SIZE = 10;
 
@@ -438,6 +452,7 @@ public void testBatchPrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchExceptionPrepared() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -502,6 +517,7 @@ public void testBatchExceptionPrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchMergePrepared() throws SQLException {
         final int BATCH_SIZE = 10;
 
@@ -531,6 +547,7 @@ public void testBatchMergePrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchMergeExceptionPrepared() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -611,6 +628,7 @@ private void populateTable(int size) throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchUpdatePrepared() throws SQLException {
         final int BATCH_SIZE = 10;
 
@@ -635,6 +653,7 @@ public void testBatchUpdatePrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchUpdateExceptionPrepared() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -690,6 +709,7 @@ public void testBatchUpdateExceptionPrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchDeletePrepared() throws SQLException {
         final int BATCH_SIZE = 10;
 
@@ -714,6 +734,7 @@ public void testBatchDeletePrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchDeleteExceptionPrepared() throws SQLException {
         final int BATCH_SIZE = 7;
 
@@ -769,6 +790,7 @@ public void testBatchDeleteExceptionPrepared() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testBatchClearPrepared() throws SQLException {
         final int BATCH_SIZE = 10;
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBulkLoadAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBulkLoadAbstractSelfTest.java
index 2a4c7995fbdf..a1432fcdab76 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBulkLoadAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinBulkLoadAbstractSelfTest.java
@@ -17,22 +17,12 @@
 
 package org.apache.ignite.jdbc.thin;
 
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.QueryEntity;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.configuration.NearCacheConfiguration;
-import org.apache.ignite.internal.processors.bulkload.BulkLoadCsvFormat;
-import org.apache.ignite.internal.processors.bulkload.BulkLoadCsvParser;
-import org.apache.ignite.internal.processors.query.QueryUtils;
-import org.apache.ignite.lang.IgniteClosure;
-import org.apache.ignite.testframework.GridTestUtils;
-
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.CodingErrorAction;
 import java.nio.charset.UnsupportedCharsetException;
 import java.sql.BatchUpdateException;
+import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -41,6 +31,20 @@
 import java.util.Collections;
 import java.util.Objects;
 import java.util.concurrent.Callable;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.bulkload.BulkLoadCsvFormat;
+import org.apache.ignite.internal.processors.bulkload.BulkLoadCsvParser;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.lang.IgniteClosure;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -49,6 +53,7 @@
 /**
  * COPY statement tests.
  */
+@RunWith(JUnit4.class)
 public abstract class JdbcThinBulkLoadAbstractSelfTest extends JdbcThinAbstractDmlStatementSelfTest {
     /** Subdirectory with CSV files */
     private static final String CSV_FILE_SUBDIR = "/modules/clients/src/test/resources/";
@@ -194,6 +199,7 @@ private CacheConfiguration cacheConfigWithQueryEntity() {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testBasicStatement() throws SQLException {
         int updatesCnt = stmt.executeUpdate(BASIC_SQL_COPY_STMT);
 
@@ -208,6 +214,7 @@ public void testBasicStatement() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testEmptyFile() throws SQLException {
         int updatesCnt = stmt.executeUpdate(
             "copy from '" + BULKLOAD_EMPTY_CSV_FILE + "' into " + TBL_NAME +
@@ -224,6 +231,7 @@ public void testEmptyFile() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testOneLineFile() throws SQLException {
         int updatesCnt = stmt.executeUpdate(
             "copy from '" + BULKLOAD_ONE_LINE_CSV_FILE + "' into " + TBL_NAME +
@@ -238,6 +246,7 @@ public void testOneLineFile() throws SQLException {
     /**
      * Verifies that error is reported for empty charset name.
      */
+    @Test
     public void testEmptyCharset() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -254,6 +263,7 @@ public void testEmptyCharset() {
     /**
      * Verifies that error is reported for unsupported charset name.
      */
+    @Test
     public void testNotSupportedCharset() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -270,6 +280,7 @@ public void testNotSupportedCharset() {
     /**
      * Verifies that error is reported for unknown charset name.
      */
+    @Test
     public void testUnknownCharset() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -288,6 +299,7 @@ public void testUnknownCharset() {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testAsciiCharset() throws SQLException {
         int updatesCnt = stmt.executeUpdate(
             "copy from '" + BULKLOAD_TWO_LINES_CSV_FILE + "'" +
@@ -306,6 +318,7 @@ public void testAsciiCharset() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testUtf8Charset() throws SQLException {
         checkBulkLoadWithCharset(BULKLOAD_UTF8_CSV_FILE, "utf-8");
     }
@@ -315,6 +328,7 @@ public void testUtf8Charset() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testWin1251Charset() throws SQLException {
         checkBulkLoadWithCharset(BULKLOAD_CP1251_CSV_FILE, "windows-1251");
     }
@@ -344,6 +358,7 @@ private void checkBulkLoadWithCharset(String fileName, String charsetName) throw
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testWrongCharset_Utf8AsWin1251() throws SQLException {
         checkBulkLoadWithWrongCharset(BULKLOAD_UTF8_CSV_FILE, "UTF-8", "windows-1251");
     }
@@ -354,6 +369,7 @@ public void testWrongCharset_Utf8AsWin1251() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testWrongCharset_Win1251AsUtf8() throws SQLException {
         checkBulkLoadWithWrongCharset(BULKLOAD_CP1251_CSV_FILE, "windows-1251", "UTF-8");
     }
@@ -364,6 +380,7 @@ public void testWrongCharset_Win1251AsUtf8() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testWrongCharset_Utf8AsAscii() throws SQLException {
         checkBulkLoadWithWrongCharset(BULKLOAD_UTF8_CSV_FILE, "UTF-8", "ascii");
     }
@@ -374,6 +391,7 @@ public void testWrongCharset_Utf8AsAscii() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testWrongCharset_Win1251AsAscii() throws SQLException {
         checkBulkLoadWithWrongCharset(BULKLOAD_CP1251_CSV_FILE, "windows-1251", "ascii");
     }
@@ -384,6 +402,7 @@ public void testWrongCharset_Win1251AsAscii() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testPacketSize_1() throws SQLException {
         int updatesCnt = stmt.executeUpdate(BASIC_SQL_COPY_STMT + " packet_size 1");
 
@@ -398,6 +417,7 @@ public void testPacketSize_1() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDefaultCharset() throws SQLException {
         int updatesCnt = stmt.executeUpdate(
             "copy from '" + BULKLOAD_UTF8_CSV_FILE + "' into " + TBL_NAME +
@@ -409,6 +429,33 @@ public void testDefaultCharset() throws SQLException {
         checkNationalCacheContents(TBL_NAME);
     }
 
+    /**
+     * Test imports CSV file into a table on not affinity node and checks the created entries using SELECT statement.
+     *
+     * @throws SQLException If failed.
+     */
+    @Test
+    public void testBulkLoadToNonAffinityNode() throws Exception {
+        IgniteEx client = startGrid(getConfiguration("client").setClientMode(true));
+
+        try (Connection con = connect(client, null)) {
+            con.setSchema('"' + DEFAULT_CACHE_NAME + '"');
+
+            try (Statement stmt = con.createStatement()) {
+                int updatesCnt = stmt.executeUpdate(
+                    "copy from '" + BULKLOAD_UTF8_CSV_FILE + "' into " + TBL_NAME +
+                        " (_key, age, firstName, lastName)" +
+                        " format csv");
+
+                assertEquals(2, updatesCnt);
+
+                checkNationalCacheContents(TBL_NAME);
+            }
+        }
+
+        stopGrid(client.name());
+    }
+
     /**
      * Imports two-entry CSV file with UTF-8 characters into a table using packet size of one byte
      * (thus splitting each two-byte UTF-8 character into two packets)
@@ -416,6 +463,7 @@ public void testDefaultCharset() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testDefaultCharsetPacketSize1() throws SQLException {
         int updatesCnt = stmt.executeUpdate(
             "copy from '" + BULKLOAD_UTF8_CSV_FILE + "' into " + TBL_NAME +
@@ -430,6 +478,7 @@ public void testDefaultCharsetPacketSize1() throws SQLException {
     /**
      * Checks that error is reported for a non-existent file.
      */
+    @Test
     public void testWrongFileName() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -446,6 +495,7 @@ public void testWrongFileName() {
     /**
      * Checks that error is reported if the destination table is missing.
      */
+    @Test
     public void testMissingTable() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -462,6 +512,7 @@ public void testMissingTable() {
     /**
      * Checks that error is reported when a non-existing column is specified in the SQL command.
      */
+    @Test
     public void testWrongColumnName() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -478,6 +529,7 @@ public void testWrongColumnName() {
     /**
      * Checks that error is reported if field read from CSV file cannot be converted to the type of the column.
      */
+    @Test
     public void testWrongColumnType() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -496,6 +548,7 @@ public void testWrongColumnType() {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testFieldsSubset() throws SQLException {
         int updatesCnt = stmt.executeUpdate(
             "copy from '" + BULKLOAD_TWO_LINES_CSV_FILE + "'" +
@@ -516,6 +569,7 @@ public void testFieldsSubset() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testCreateAndBulkLoadTable() throws SQLException {
         String tblName = QueryUtils.DFLT_SCHEMA + ".\"PersonTbl\"";
 
@@ -541,6 +595,7 @@ public void testCreateAndBulkLoadTable() throws SQLException {
      * @throws SQLException If failed.
      */
     @SuppressWarnings("unchecked")
+    @Test
     public void testConfigureQueryEntityAndBulkLoad() throws SQLException {
         ignite(0).getOrCreateCache(cacheConfigWithQueryEntity());
 
@@ -556,6 +611,7 @@ public void testConfigureQueryEntityAndBulkLoad() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testMultipleStatement() throws SQLException {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -581,6 +637,7 @@ public void testMultipleStatement() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteQuery() throws SQLException {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -596,6 +653,7 @@ public void testExecuteQuery() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         boolean isRowSet = stmt.execute(BASIC_SQL_COPY_STMT);
 
@@ -609,6 +667,7 @@ public void testExecute() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testPreparedStatementWithExecuteUpdate() throws SQLException {
         PreparedStatement pstmt = conn.prepareStatement(BASIC_SQL_COPY_STMT);
 
@@ -624,6 +683,7 @@ public void testPreparedStatementWithExecuteUpdate() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testPreparedStatementWithParameter() throws SQLException {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -646,6 +706,7 @@ public void testPreparedStatementWithParameter() throws SQLException {
      *
      * @throws SQLException If failed.
      */
+    @Test
     public void testPreparedStatementWithExecute() throws SQLException {
         PreparedStatement pstmt = conn.prepareStatement(BASIC_SQL_COPY_STMT);
 
@@ -659,6 +720,7 @@ public void testPreparedStatementWithExecute() throws SQLException {
     /**
      * Verifies that COPY command is rejected by PreparedStatement.executeQuery().
      */
+    @Test
     public void testPreparedStatementWithExecuteQuery() {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlCustomSchemaSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlCustomSchemaSelfTest.java
index 8fd9356533be..e4d7d1519c2d 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlCustomSchemaSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlCustomSchemaSelfTest.java
@@ -22,10 +22,14 @@
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Base class for complex SQL tests based on JDBC driver.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinComplexDmlDdlCustomSchemaSelfTest extends JdbcThinComplexDmlDdlSelfTest {
     /** Simple schema. */
     private static final String SCHEMA_1 = "SCHEMA_1";
@@ -55,6 +59,7 @@
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateSelectDropEscapedSchema() throws Exception {
         try {
             curSchema = SCHEMA_2;
@@ -71,8 +76,9 @@ public void testCreateSelectDropEscapedSchema() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testMultiple() throws Exception {
         testCreateSelectDrop();
         testCreateSelectDrop();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java
index 36ee34a5fc95..f721e0c0eeb8 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexDmlDdlSelfTest.java
@@ -39,10 +39,14 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Base class for complex SQL tests based on JDBC driver.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinComplexDmlDdlSelfTest extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -127,7 +131,7 @@ protected Connection createConnection() throws SQLException {
     /**
      * @throws Exception If failed.
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCreateSelectDrop() throws Exception {
         conn = createConnection();
 
@@ -477,4 +481,4 @@ private Row(Object[] row) {
             return Arrays.toString(row);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexQuerySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexQuerySelfTest.java
index 692de7ca7de7..025c4a8f8ab5 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexQuerySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinComplexQuerySelfTest.java
@@ -31,6 +31,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -39,6 +42,7 @@
 /**
  * Tests for complex queries (joins, etc.).
  */
+@RunWith(JUnit4.class)
 public class JdbcThinComplexQuerySelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -130,6 +134,7 @@ protected CacheConfiguration cacheConfiguration() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoin() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name as orgName from \"pers\".Person p, \"org\".Organization o where p.orgId = o.id");
@@ -165,6 +170,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJoinWithoutAlias() throws Exception {
         ResultSet rs = stmt.executeQuery(
             "select p.id, p.name, o.name from \"pers\".Person p, \"org\".Organization o where p.orgId = o.id");
@@ -203,6 +209,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIn() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from \"pers\".Person where age in (25, 35)");
 
@@ -223,6 +230,7 @@ public void testIn() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBetween() throws Exception {
         ResultSet rs = stmt.executeQuery("select name from \"pers\".Person where age between 24 and 36");
 
@@ -243,6 +251,7 @@ public void testBetween() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCalculatedValue() throws Exception {
         ResultSet rs = stmt.executeQuery("select age * 2 from \"pers\".Person");
 
@@ -322,4 +331,4 @@ private Organization(int id, String name) {
             this.name = name;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
index 4f6651c2c0b7..a5840c632250 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
@@ -45,11 +45,15 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * JDBC driver reconnect test with multiple addresses.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinConnectionMultipleAddressesTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -131,6 +135,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesConnect() throws Exception {
         try (Connection conn = DriverManager.getConnection(url())) {
             try (Statement stmt = conn.createStatement()) {
@@ -148,6 +153,7 @@ public void testMultipleAddressesConnect() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPortRangeConnect() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL_PORT_RANGE)) {
             try (Statement stmt = conn.createStatement()) {
@@ -165,6 +171,7 @@ public void testPortRangeConnect() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesOneNodeFailoverOnStatementExecute() throws Exception {
         checkReconnectOnStatementExecute(url(), false);
     }
@@ -172,6 +179,7 @@ public void testMultipleAddressesOneNodeFailoverOnStatementExecute() throws Exce
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesAllNodesFailoverOnStatementExecute() throws Exception {
         checkReconnectOnStatementExecute(url(), true);
     }
@@ -179,6 +187,7 @@ public void testMultipleAddressesAllNodesFailoverOnStatementExecute() throws Exc
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPortRangeAllNodesFailoverOnStatementExecute() throws Exception {
         checkReconnectOnStatementExecute(URL_PORT_RANGE, true);
     }
@@ -186,6 +195,7 @@ public void testPortRangeAllNodesFailoverOnStatementExecute() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesOneNodeFailoverOnResultSet() throws Exception {
         checkReconnectOnResultSet(url(), false);
     }
@@ -193,6 +203,7 @@ public void testMultipleAddressesOneNodeFailoverOnResultSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesAllNodesFailoverOnResultSet() throws Exception {
         checkReconnectOnResultSet(url(), true);
     }
@@ -200,6 +211,7 @@ public void testMultipleAddressesAllNodesFailoverOnResultSet() throws Exception
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPortRangeAllNodesFailoverOnResultSet() throws Exception {
         checkReconnectOnResultSet(URL_PORT_RANGE, true);
     }
@@ -207,6 +219,7 @@ public void testPortRangeAllNodesFailoverOnResultSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesOneNodeFailoverOnMeta() throws Exception {
         checkReconnectOnMeta(url(), false);
     }
@@ -214,6 +227,7 @@ public void testMultipleAddressesOneNodeFailoverOnMeta() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesAllNodesFailoverOnMeta() throws Exception {
         checkReconnectOnMeta(url(), true);
     }
@@ -221,6 +235,7 @@ public void testMultipleAddressesAllNodesFailoverOnMeta() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPortRangeAllNodesFailoverOnMeta() throws Exception {
         checkReconnectOnMeta(URL_PORT_RANGE, true);
     }
@@ -228,6 +243,7 @@ public void testPortRangeAllNodesFailoverOnMeta() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultipleAddressesOneNodeFailoverOnStreaming() throws Exception {
         checkReconnectOnStreaming(url(), false);
     }
@@ -235,6 +251,7 @@ public void testMultipleAddressesOneNodeFailoverOnStreaming() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClientConnectionMXBean() throws Exception {
         Connection conn = DriverManager.getConnection(URL_PORT_RANGE);
 
@@ -548,4 +565,4 @@ private void restart(boolean all) throws Exception {
         if (all)
             startGrids(NODES_CNT);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMvccEnabledSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMvccEnabledSelfTest.java
index 0196cb2a7346..d186dcd7970e 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMvccEnabledSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMvccEnabledSelfTest.java
@@ -33,6 +33,9 @@
 import org.apache.ignite.testframework.GridStringLogger;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Connection.TRANSACTION_NONE;
 import static java.sql.Connection.TRANSACTION_READ_COMMITTED;
@@ -44,6 +47,7 @@
  * Connection test.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinConnectionMvccEnabledSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -52,11 +56,11 @@
     private static final String URL = "jdbc:ignite:thin://127.0.0.1";
 
     /** {@inheritDoc} */
-    @SuppressWarnings("deprecation")
+    @SuppressWarnings({"deprecation", "unchecked"})
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
-        cfg.setCacheConfiguration(cacheConfiguration(DEFAULT_CACHE_NAME));
+        cfg.setCacheConfiguration(cacheConfiguration(DEFAULT_CACHE_NAME).setNearConfiguration(null));
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
@@ -65,7 +69,6 @@
         cfg.setDiscoverySpi(disco);
 
         cfg.setMarshaller(new BinaryMarshaller());
-
         cfg.setGridLogger(new GridStringLogger());
 
         return cfg;
@@ -74,9 +77,8 @@
     /**
      * @param name Cache name.
      * @return Cache configuration.
-     * @throws Exception In case of error.
      */
-    private CacheConfiguration cacheConfiguration(@NotNull String name) throws Exception {
+    private CacheConfiguration cacheConfiguration(@NotNull String name) {
         CacheConfiguration cfg = defaultCacheConfiguration();
 
         cfg.setName(name);
@@ -101,6 +103,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMetadataDefaults() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -119,6 +122,7 @@ public void testMetadataDefaults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetAutoCommit() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assertTrue(conn.getMetaData().supportsTransactions());
@@ -147,6 +151,7 @@ public void testGetSetAutoCommit() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCommit() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assertTrue(conn.getMetaData().supportsTransactions());
@@ -182,6 +187,7 @@ public void testCommit() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRollback() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assertTrue(conn.getMetaData().supportsTransactions());
@@ -217,6 +223,7 @@ public void testRollback() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetSavepoint() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -256,6 +263,7 @@ public void testSetSavepoint() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetSavepointName() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -310,6 +318,7 @@ public void testSetSavepointName() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRollbackSavePoint() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -375,4 +384,4 @@ private Savepoint getFakeSavepoint() {
             }
         };
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSSLTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSSLTest.java
index 355a198c5667..10d6570e8b8b 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSSLTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSSLTest.java
@@ -37,11 +37,15 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.ssl.SslContextFactory;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * SSL connection test.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinConnectionSSLTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -95,6 +99,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testConnection() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -118,6 +123,7 @@ public void testConnection() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testConnectionTrustAll() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -140,6 +146,7 @@ public void testConnectionTrustAll() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testConnectionUseIgniteFactory() throws Exception {
         setSslCtxFactoryToIgnite = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -163,6 +170,7 @@ public void testConnectionUseIgniteFactory() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDefaultContext() throws Exception {
         // Store exists default SSL context to restore after test.
         final SSLContext dfltSslCtx = SSLContext.getDefault();
@@ -200,6 +208,7 @@ public void testDefaultContext() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testContextFactory() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -218,6 +227,7 @@ public void testContextFactory() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSslServerAndPlainClient() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -241,6 +251,7 @@ public void testSslServerAndPlainClient() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInvalidKeystoreConfig() throws Exception {
         setSslCtxFactoryToCli = true;
 
@@ -329,6 +340,7 @@ public void testInvalidKeystoreConfig() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUnknownClientCertificate() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -356,6 +368,7 @@ public void testUnknownClientCertificate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUnsupportedSslProtocol() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -384,6 +397,7 @@ public void testUnsupportedSslProtocol() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInvalidKeyAlgorithm() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -412,6 +426,7 @@ public void testInvalidKeyAlgorithm() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInvalidKeyStoreType() throws Exception {
         setSslCtxFactoryToCli = true;
         sslCtxFactory = getTestSslContextFactory();
@@ -476,4 +491,4 @@ public void checkConnection(Connection conn) throws SQLException {
             return getTestSslContextFactory().create().getSocketFactory();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
index 80397e65e7ae..11f9770846ae 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
@@ -53,6 +53,9 @@
 import org.apache.ignite.testframework.GridStringLogger;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Connection.TRANSACTION_NONE;
 import static java.sql.Connection.TRANSACTION_READ_COMMITTED;
@@ -66,11 +69,13 @@
 import static java.sql.Statement.NO_GENERATED_KEYS;
 import static java.sql.Statement.RETURN_GENERATED_KEYS;
 import static org.apache.ignite.configuration.ClientConnectorConfiguration.DFLT_PORT;
+import static org.apache.ignite.internal.processors.odbc.SqlStateCode.TRANSACTION_STATE_EXCEPTION;
 
 /**
  * Connection test.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinConnectionSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -130,6 +135,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
      * @throws Exception If failed.
      */
     @SuppressWarnings({"EmptyTryBlock", "unused"})
+    @Test
     public void testDefaults() throws Exception {
         try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1")) {
             // No-op.
@@ -143,6 +149,7 @@ public void testDefaults() throws Exception {
     /**
      * Test invalid endpoint.
      */
+    @Test
     public void testInvalidEndpoint() {
         assertInvalid("jdbc:ignite:thin://", "Host name is empty");
         assertInvalid("jdbc:ignite:thin://:10000", "Host name is empty");
@@ -159,6 +166,7 @@ public void testInvalidEndpoint() {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testSocketBuffers() throws Exception {
         final int dfltDufSize = 64 * 1024;
 
@@ -196,6 +204,7 @@ public void testSocketBuffers() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testSocketBuffersSemicolon() throws Exception {
         final int dfltDufSize = 64 * 1024;
 
@@ -228,6 +237,7 @@ public void testSocketBuffersSemicolon() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlHints() throws Exception {
         try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1")) {
             assertHints(conn, false, false, false, false, false, false);
@@ -268,6 +278,7 @@ public void testSqlHints() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlHintsSemicolon() throws Exception {
         try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;distributedJoins=true")) {
             assertHints(conn, true, false, false, false, false, false);
@@ -326,6 +337,7 @@ private void assertHints(Connection conn, boolean distributedJoins, boolean enfo
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testTcpNoDelay() throws Exception {
         assertInvalid("jdbc:ignite:thin://127.0.0.1?tcpNoDelay=0",
             "Invalid property value. [name=tcpNoDelay, val=0, choices=[true, false]]");
@@ -365,6 +377,7 @@ public void testTcpNoDelay() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testTcpNoDelaySemicolon() throws Exception {
         assertInvalid("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=0",
             "Invalid property value. [name=tcpNoDelay, val=0, choices=[true, false]]");
@@ -400,6 +413,7 @@ public void testTcpNoDelaySemicolon() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testAutoCloseServerCursorProperty() throws Exception {
         String url = "jdbc:ignite:thin://127.0.0.1?autoCloseServerCursor";
 
@@ -436,6 +450,7 @@ public void testAutoCloseServerCursorProperty() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testAutoCloseServerCursorPropertySemicolon() throws Exception {
         String url = "jdbc:ignite:thin://127.0.0.1;autoCloseServerCursor";
 
@@ -468,6 +483,7 @@ public void testAutoCloseServerCursorPropertySemicolon() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testSchema() throws Exception {
         assertInvalid("jdbc:ignite:thin://127.0.0.1/qwe/qwe",
             "Invalid URL format (only schema name is allowed in URL path parameter 'host:port[/schemaName]')" );
@@ -490,6 +506,7 @@ public void testSchema() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testSchemaSemicolon() throws Exception {
         try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;schema=public")) {
             assertEquals("Invalid schema", "PUBLIC", conn.getSchema());
@@ -538,6 +555,7 @@ private void assertInvalid(final String url, String errMsg) {
      * @throws Exception If failed.
      */
     @SuppressWarnings("ThrowableNotThrown")
+    @Test
     public void testClose() throws Exception {
         final Connection conn;
 
@@ -564,6 +582,7 @@ public void testClose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateStatement() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             try (Statement stmt = conn.createStatement()) {
@@ -586,6 +605,7 @@ public void testCreateStatement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateStatement2() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             int [] rsTypes = new int[]
@@ -639,6 +659,7 @@ public void testCreateStatement2() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateStatement3() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             int [] rsTypes = new int[]
@@ -698,6 +719,7 @@ public void testCreateStatement3() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepareStatement() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // null query text
@@ -731,6 +753,7 @@ public void testPrepareStatement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepareStatement3() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             final String sqlText = "select * from test where param = ?";
@@ -791,6 +814,7 @@ public void testPrepareStatement3() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepareStatement4() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             final String sqlText = "select * from test where param = ?";
@@ -856,6 +880,7 @@ public void testPrepareStatement4() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepareStatementAutoGeneratedKeysUnsupported() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             final String sqlText = "insert into test (val) values (?)";
@@ -905,6 +930,7 @@ public void testPrepareStatementAutoGeneratedKeysUnsupported() throws Exception
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrepareCallUnsupported() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             final String sqlText = "exec test()";
@@ -945,6 +971,7 @@ public void testPrepareCallUnsupported() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNativeSql() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // null query text
@@ -976,31 +1003,23 @@ public void testNativeSql() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetAutoCommit() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
-            assertTrue(conn.getAutoCommit());
-
-            // Cannot disable autocommit when MVCC is disabled.
-            GridTestUtils.assertThrows(log,
-                new Callable<Object>() {
-                    @Override public Object call() throws Exception {
-                        conn.setAutoCommit(false);
+            boolean ac0 = conn.getAutoCommit();
 
-                        return null;
-                    }
-                },
-                SQLException.class,
-                "MVCC must be enabled in order to invoke transactional operation: COMMIT"
-            );
+            conn.setAutoCommit(!ac0);
+            // assert no exception
 
-            assertTrue(conn.getAutoCommit());
+            conn.setAutoCommit(ac0);
+            // assert no exception
 
             conn.close();
 
             // Exception when called on closed connection
             checkConnectionClosed(new RunnableX() {
                 @Override public void run() throws Exception {
-                    conn.setAutoCommit(true);
+                    conn.setAutoCommit(ac0);
                 }
             });
         }
@@ -1009,6 +1028,7 @@ public void testGetSetAutoCommit() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCommit() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Should not be called in auto-commit mode
@@ -1024,19 +1044,6 @@ public void testCommit() throws Exception {
                 "Transaction cannot be committed explicitly in auto-commit mode"
             );
 
-            // Cannot disable autocommit when MVCC is disabled.
-            GridTestUtils.assertThrows(log,
-                new Callable<Object>() {
-                    @Override public Object call() throws Exception {
-                        conn.setAutoCommit(false);
-
-                        return null;
-                    }
-                },
-                SQLException.class,
-                "MVCC must be enabled in order to invoke transactional operation: COMMIT"
-            );
-
             assertTrue(conn.getAutoCommit());
 
             // Should not be called in auto-commit mode
@@ -1066,6 +1073,7 @@ public void testCommit() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRollback() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Should not be called in auto-commit mode
@@ -1081,21 +1089,6 @@ public void testRollback() throws Exception {
                 "Transaction cannot be rolled back explicitly in auto-commit mode."
             );
 
-            // Cannot disable autocommit when MVCC is disabled.
-            GridTestUtils.assertThrows(log,
-                new Callable<Object>() {
-                    @Override public Object call() throws Exception {
-                        conn.setAutoCommit(false);
-
-                        return null;
-                    }
-                },
-                SQLException.class,
-                "MVCC must be enabled in order to invoke transactional operation: COMMIT"
-            );
-
-            assertTrue(conn.getAutoCommit());
-
             conn.close();
 
             // Exception when called on closed connection
@@ -1107,9 +1100,54 @@ public void testRollback() throws Exception {
         }
     }
 
+    /**
+     * @throws Exception if failed.
+     */
+    @Test
+    public void testBeginFailsWhenMvccIsDisabled() throws Exception {
+        try (Connection conn = DriverManager.getConnection(URL)) {
+            conn.createStatement().execute("BEGIN");
+
+            fail("Exception is expected");
+        }
+        catch (SQLException e) {
+            assertEquals(TRANSACTION_STATE_EXCEPTION, e.getSQLState());
+        }
+    }
+
+    /**
+     * @throws Exception if failed.
+     */
+    @Test
+    public void testCommitIgnoredWhenMvccIsDisabled() throws Exception {
+        try (Connection conn = DriverManager.getConnection(URL)) {
+            conn.setAutoCommit(false);
+            conn.createStatement().execute("COMMIT");
+
+            conn.commit();
+        }
+        // assert no exception
+    }
+
+    /**
+     * @throws Exception if failed.
+     */
+    @Test
+    public void testRollbackIgnoredWhenMvccIsDisabled() throws Exception {
+        try (Connection conn = DriverManager.getConnection(URL)) {
+            conn.setAutoCommit(false);
+
+            conn.createStatement().execute("ROLLBACK");
+
+            conn.rollback();
+        }
+        // assert no exception
+    }
+
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetMetaData() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -1130,6 +1168,7 @@ public void testGetMetaData() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetReadOnly() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             conn.close();
@@ -1153,6 +1192,7 @@ public void testGetSetReadOnly() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetCatalog() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsCatalogsInDataManipulation();
@@ -1184,6 +1224,7 @@ public void testGetSetCatalog() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetTransactionIsolation() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Invalid parameter value
@@ -1234,6 +1275,7 @@ public void testGetSetTransactionIsolation() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClearGetWarnings() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             SQLWarning warn = conn.getWarnings();
@@ -1267,6 +1309,7 @@ public void testClearGetWarnings() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetTypeMap() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             GridTestUtils.assertThrows(log,
@@ -1322,6 +1365,7 @@ public void testGetSetTypeMap() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetHoldability() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // default value
@@ -1375,6 +1419,7 @@ public void testGetSetHoldability() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetSavepoint() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -1392,21 +1437,6 @@ public void testSetSavepoint() throws Exception {
                 "Savepoint cannot be set in auto-commit mode"
             );
 
-            // Cannot disable autocommit when MVCC is disabled.
-            GridTestUtils.assertThrows(log,
-                new Callable<Object>() {
-                    @Override public Object call() throws Exception {
-                        conn.setAutoCommit(false);
-
-                        return null;
-                    }
-                },
-                SQLException.class,
-                "MVCC must be enabled in order to invoke transactional operation: COMMIT"
-            );
-
-            assertTrue(conn.getAutoCommit());
-
             conn.close();
 
             checkConnectionClosed(new RunnableX() {
@@ -1420,6 +1450,7 @@ public void testSetSavepoint() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetSavepointName() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -1452,21 +1483,6 @@ public void testSetSavepointName() throws Exception {
                 "Savepoint cannot be set in auto-commit mode"
             );
 
-            // Cannot disable autocommit when MVCC is disabled.
-            GridTestUtils.assertThrows(log,
-                new Callable<Object>() {
-                    @Override public Object call() throws Exception {
-                        conn.setAutoCommit(false);
-
-                        return null;
-                    }
-                },
-                SQLException.class,
-                "MVCC must be enabled in order to invoke transactional operation: COMMIT"
-            );
-
-            assertTrue(conn.getAutoCommit());
-
             conn.close();
 
             checkConnectionClosed(new RunnableX() {
@@ -1480,6 +1496,7 @@ public void testSetSavepointName() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRollbackSavePoint() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -1512,21 +1529,6 @@ public void testRollbackSavePoint() throws Exception {
                 "Auto-commit mode"
             );
 
-            // Cannot disable autocommit when MVCC is disabled.
-            GridTestUtils.assertThrows(log,
-                new Callable<Object>() {
-                    @Override public Object call() throws Exception {
-                        conn.setAutoCommit(false);
-
-                        return null;
-                    }
-                },
-                SQLException.class,
-                "MVCC must be enabled in order to invoke transactional operation: COMMIT"
-            );
-
-            assertTrue(conn.getAutoCommit());
-
             conn.close();
 
             checkConnectionClosed(new RunnableX() {
@@ -1540,6 +1542,7 @@ public void testRollbackSavePoint() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testReleaseSavepoint() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert !conn.getMetaData().supportsSavepoints();
@@ -1578,6 +1581,7 @@ public void testReleaseSavepoint() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateClob() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Unsupported
@@ -1608,6 +1612,7 @@ public void testCreateClob() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateBlob() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Unsupported
@@ -1638,6 +1643,7 @@ public void testCreateBlob() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateNClob() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Unsupported
@@ -1668,6 +1674,7 @@ public void testCreateNClob() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateSQLXML() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Unsupported
@@ -1698,6 +1705,7 @@ public void testCreateSQLXML() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetClientInfoPair() throws Exception {
 //        fail("https://issues.apache.org/jira/browse/IGNITE-5425");
 
@@ -1733,6 +1741,7 @@ public void testGetSetClientInfoPair() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetClientInfoProperties() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             final String name = "ApplicationName";
@@ -1771,6 +1780,7 @@ public void testGetSetClientInfoProperties() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateArrayOf() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             final String typeName = "varchar";
@@ -1811,6 +1821,7 @@ public void testCreateArrayOf() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCreateStruct() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // Invalid typename
@@ -1847,6 +1858,7 @@ public void testCreateStruct() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetSchema() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assertEquals("PUBLIC", conn.getSchema());
@@ -1880,6 +1892,7 @@ public void testGetSetSchema() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testAbort() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             //Invalid executor
@@ -1906,6 +1919,7 @@ public void testAbort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetSetNetworkTimeout() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // default
@@ -1964,7 +1978,7 @@ public void testGetSetNetworkTimeout() throws Exception {
     /**
      * Test that attempting to supply invalid nested TX mode to driver fails on the client.
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testInvalidNestedTxMode() {
         GridTestUtils.assertThrows(null, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -1980,7 +1994,7 @@ public void testInvalidNestedTxMode() {
      * We have to do this without explicit {@link Connection} as long as there's no other way to bypass validation and
      * supply a malformed {@link ConnectionProperties} to {@link JdbcThinTcpIo}.
      */
-    @SuppressWarnings({"ThrowableResultOfMethodCallIgnored", "ThrowFromFinallyBlock"})
+    @Test
     public void testInvalidNestedTxModeOnServerSide() throws SQLException, NoSuchMethodException,
         IllegalAccessException, InvocationTargetException, InstantiationException, IOException {
         ConnectionPropertiesImpl connProps = new ConnectionPropertiesImpl();
@@ -2015,6 +2029,7 @@ public void testInvalidNestedTxModeOnServerSide() throws SQLException, NoSuchMet
 
     /**
      */
+    @Test
     public void testSslClientAndPlainServer()  {
         GridTestUtils.assertThrows(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -2032,6 +2047,7 @@ public void testSslClientAndPlainServer()  {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testMultithreadingException() throws Exception {
         int threadCnt = 10;
 
@@ -2091,4 +2107,4 @@ private Savepoint getFakeSavepoint() {
             }
         };
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
index 6040bed3e2cf..cead71a69188 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
@@ -43,11 +43,15 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * DataSource test.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinDataSourceSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -98,6 +102,7 @@ private CacheConfiguration cacheConfiguration(String name) throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testJndi() throws Exception {
         IgniteJdbcThinDataSource ids = new IgniteJdbcThinDataSource();
 
@@ -117,6 +122,7 @@ public void testJndi() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUrlCompose() throws Exception {
         IgniteJdbcThinDataSource ids = new IgniteJdbcThinDataSource();
 
@@ -139,6 +145,7 @@ public void testUrlCompose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testResetUrl() throws Exception {
         IgniteJdbcThinDataSource ids = new IgniteJdbcThinDataSource();
 
@@ -157,6 +164,7 @@ public void testResetUrl() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSqlHints() throws Exception {
         IgniteJdbcThinDataSource ids = new IgniteJdbcThinDataSource();
 
@@ -195,6 +203,7 @@ public void testSqlHints() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTcpNoDelay() throws Exception {
         IgniteJdbcThinDataSource ids = new IgniteJdbcThinDataSource();
 
@@ -218,6 +227,7 @@ public void testTcpNoDelay() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSocketBuffers() throws Exception {
         final IgniteJdbcThinDataSource ids = new IgniteJdbcThinDataSource();
 
@@ -426,4 +436,4 @@ private InitialContext getInitialContext() throws Exception {
             return null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDeleteStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDeleteStatementSelfTest.java
index 9d0665b8fe3d..d11e5bb95861 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDeleteStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDeleteStatementSelfTest.java
@@ -20,14 +20,19 @@
 import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.HashSet;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcThinDeleteStatementSelfTest extends JdbcThinAbstractUpdateStatementSelfTest {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         conn.createStatement().execute("delete from Person where cast(substring(_key, 2, 1) as int) % 2 = 0");
 
@@ -38,6 +43,7 @@ public void testExecute() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         int res =
             conn.createStatement().executeUpdate("delete from Person where cast(substring(_key, 2, 1) as int) % 2 = 0");
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDynamicIndexAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDynamicIndexAbstractSelfTest.java
index 539713aeb4cd..765ca839d275 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDynamicIndexAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDynamicIndexAbstractSelfTest.java
@@ -33,10 +33,14 @@
 import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test that checks indexes handling with JDBC.
  */
+@RunWith(JUnit4.class)
 public abstract class JdbcThinDynamicIndexAbstractSelfTest extends JdbcThinAbstractDmlStatementSelfTest {
     /** */
     private static final String CREATE_INDEX = "create index idx on Person (id desc)";
@@ -143,6 +147,7 @@ private Object getSingleValue(ResultSet rs) throws SQLException {
      * Test that after index creation index is used by queries.
      * @throws SQLException If failed.
      */
+    @Test
     public void testCreateIndex() throws SQLException {
         assertSize(3);
 
@@ -173,6 +178,7 @@ public void testCreateIndex() throws SQLException {
      * Test that creating an index with duplicate name yields an error.
      * @throws SQLException If failed.
      */
+    @Test
     public void testCreateIndexWithDuplicateName() throws SQLException {
         jdbcRun(CREATE_INDEX);
 
@@ -189,6 +195,7 @@ public void testCreateIndexWithDuplicateName() throws SQLException {
      * Test that creating an index with duplicate name does not yield an error with {@code IF NOT EXISTS}.
      * @throws SQLException If failed.
      */
+    @Test
     public void testCreateIndexIfNotExists() throws SQLException {
         jdbcRun(CREATE_INDEX);
 
@@ -200,6 +207,7 @@ public void testCreateIndexIfNotExists() throws SQLException {
      * Test that after index drop there are no attempts to use it, and data state remains intact.
      * @throws SQLException If failed.
      */
+    @Test
     public void testDropIndex() throws SQLException {
         assertSize(3);
 
@@ -229,6 +237,7 @@ public void testDropIndex() throws SQLException {
     /**
      * Test that dropping a non-existent index yields an error.
      */
+    @Test
     public void testDropMissingIndex() {
         GridTestUtils.assertThrowsAnyCause(log, new Callable<Void>() {
             @Override public Void call() throws Exception {
@@ -243,6 +252,7 @@ public void testDropMissingIndex() {
      * Test that dropping a non-existent index does not yield an error with {@code IF EXISTS}.
      * @throws SQLException If failed.
      */
+    @Test
     public void testDropMissingIndexIfExists() throws SQLException {
         // Despite index missing, this does not yield an error.
         jdbcRun(DROP_INDEX_IF_EXISTS);
@@ -252,6 +262,7 @@ public void testDropMissingIndexIfExists() throws SQLException {
      * Test that changes in cache affect index, and vice versa.
      * @throws SQLException If failed.
      */
+    @Test
     public void testIndexState() throws SQLException {
         IgniteCache<String, Person> cache = cache();
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinEmptyCacheSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinEmptyCacheSelfTest.java
index 87c1428f78b3..f67fc522b204 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinEmptyCacheSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinEmptyCacheSelfTest.java
@@ -26,6 +26,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -33,6 +36,7 @@
 /**
  * Tests for empty cache.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinEmptyCacheSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -104,6 +108,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelectNumber() throws Exception {
         ResultSet rs = stmt.executeQuery("select 1");
 
@@ -122,6 +127,7 @@ public void testSelectNumber() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSelectString() throws Exception {
         ResultSet rs = stmt.executeQuery("select 'str'");
 
@@ -135,4 +141,4 @@ public void testSelectString() throws Exception {
 
         assert cnt == 1;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinErrorsSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinErrorsSelfTest.java
index 2ff3e9f83d1e..e14feb34b7b8 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinErrorsSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinErrorsSelfTest.java
@@ -24,12 +24,16 @@
 import java.sql.Statement;
 import org.apache.ignite.jdbc.JdbcErrorsAbstractSelfTest;
 import org.apache.ignite.lang.IgniteCallable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.junit.Assert.assertArrayEquals;
 
 /**
  * Test SQLSTATE codes propagation with thin client driver.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinErrorsSelfTest extends JdbcErrorsAbstractSelfTest {
     /** {@inheritDoc} */
     @Override protected Connection getConnection() throws SQLException {
@@ -41,6 +45,7 @@
      * due to <b>communication problems</b> (not due to clear misconfiguration).
      * @throws SQLException if failed.
      */
+    @Test
     public void testConnectionError() throws SQLException {
         checkErrorState(new IgniteCallable<Void>() {
             @Override public Void call() throws Exception {
@@ -55,6 +60,7 @@ public void testConnectionError() throws SQLException {
      * Test error code for the case when connection string is a mess.
      * @throws SQLException if failed.
      */
+    @Test
     public void testInvalidConnectionStringFormat() throws SQLException {
         checkErrorState(new IgniteCallable<Void>() {
             @Override public Void call() throws Exception {
@@ -71,6 +77,7 @@ public void testInvalidConnectionStringFormat() throws SQLException {
      * @throws SQLException if failed.
      */
     @SuppressWarnings("MagicConstant")
+    @Test
     public void testInvalidIsolationLevel() throws SQLException {
         checkErrorState(new ConnClosure() {
             @Override public void run(Connection conn) throws Exception {
@@ -83,7 +90,7 @@ public void testInvalidIsolationLevel() throws SQLException {
      * Test error code for the case when error is caused on batch execution.
      * @throws SQLException if failed.
      */
-    @SuppressWarnings("MagicConstant")
+    @Test
     public void testBatchUpdateException() throws SQLException {
         try (final Connection conn = getConnection()) {
             try (Statement stmt = conn.createStatement()) {
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinInsertStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinInsertStatementSelfTest.java
index bf55da0879eb..50c197aad5ff 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinInsertStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinInsertStatementSelfTest.java
@@ -25,10 +25,14 @@
 import java.util.HashSet;
 import java.util.concurrent.Callable;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinInsertStatementSelfTest extends JdbcThinAbstractDmlStatementSelfTest {
     /** SQL query. */
     private static final String SQL = "insert into Person(_key, id, firstName, lastName, age) values " +
@@ -140,6 +144,7 @@
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         assertEquals(3, stmt.executeUpdate(SQL));
     }
@@ -147,6 +152,7 @@ public void testExecuteUpdate() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testPreparedExecuteUpdate() throws SQLException {
         assertEquals(3, prepStmt.executeUpdate());
     }
@@ -154,6 +160,7 @@ public void testPreparedExecuteUpdate() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         assertFalse(stmt.execute(SQL));
     }
@@ -161,6 +168,7 @@ public void testExecute() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testPreparedExecute() throws SQLException {
         assertFalse(prepStmt.execute());
     }
@@ -168,6 +176,7 @@ public void testPreparedExecute() throws SQLException {
     /**
      *
      */
+    @Test
     public void testDuplicateKeys() {
         jcache(0).put("p2", new Person(2, "Joe", "Black", 35));
 
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinLocalQueriesSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinLocalQueriesSelfTest.java
index 1e28e52d3e3d..7bb7168e6e6e 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinLocalQueriesSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinLocalQueriesSelfTest.java
@@ -23,10 +23,14 @@
 import java.util.Map;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test that replicated-only query is executed locally.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinLocalQueriesSelfTest extends JdbcThinAbstractSelfTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
@@ -47,6 +51,7 @@
     /**
      *
      */
+    @Test
     public void testLocalThinJdbcQuery() throws SQLException {
         try (Connection c = connect(grid(0), "replicatedOnly=true")) {
             execute(c, "CREATE TABLE Company(id int primary key, name varchar) WITH " +
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMergeStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMergeStatementSelfTest.java
index 9d9467f3bd75..11911ba83f07 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMergeStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMergeStatementSelfTest.java
@@ -21,10 +21,14 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * MERGE statement test.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinMergeStatementSelfTest extends JdbcThinAbstractDmlStatementSelfTest {
     /** SQL query. */
     private static final String SQL = "merge into Person(_key, id, firstName, lastName, age) values " +
@@ -117,6 +121,7 @@
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         assertEquals(3, stmt.executeUpdate(SQL));
     }
@@ -124,6 +129,7 @@ public void testExecuteUpdate() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         assertFalse(stmt.execute(SQL));
     }
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataPrimaryKeysSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataPrimaryKeysSelfTest.java
new file mode 100644
index 000000000000..a4ef3119b3c2
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataPrimaryKeysSelfTest.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.jdbc.thin;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Verifies that primary keys in the metadata are valid.
+ */
+@RunWith(JUnit4.class)
+public class JdbcThinMetadataPrimaryKeysSelfTest extends GridCommonAbstractTest {
+    /** Url. */
+    private static final String URL = "jdbc:ignite:thin://127.0.0.1";
+
+    /** COLUMN_NAME column index in the metadata table. */
+    private static final int COL_NAME_IDX = 4;
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        super.beforeTestsStarted();
+
+        startGrid(1);
+    }
+
+    /**
+     * Execute update sql operation using new connection.
+     *
+     * @param sql update SQL query.
+     * @return update count.
+     * @throws SQLException on error.
+     */
+    private int executeUpdate(String sql) throws SQLException {
+        try (Connection conn = DriverManager.getConnection(URL)) {
+            try (PreparedStatement stmt = conn.prepareStatement(sql)) {
+                return stmt.executeUpdate();
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        executeUpdate("DROP TABLE IF EXISTS TEST;");
+    }
+
+    /**
+     * Checks for PK that contains single unwrapped field.
+     */
+    @Test
+    public void testSingleUnwrappedKey() throws Exception {
+        executeUpdate("CREATE TABLE TEST (ID LONG PRIMARY KEY, NAME VARCHAR);");
+
+        checkPKFields("TEST", "ID");
+    }
+
+    /**
+     * Checks for PK that contains single field. Key is forcibly wrapped.
+     */
+    @Test
+    public void testSingleWrappedKey() throws Exception {
+        executeUpdate("CREATE TABLE TEST (" +
+            "ID LONG PRIMARY KEY, " +
+            "NAME VARCHAR) " +
+            "WITH \"wrap_key=true\";");
+
+        checkPKFields("TEST", "ID");
+    }
+
+    /**
+     * Checks for composite (so implicitly wrapped) primary key.
+     */
+    @Test
+    public void testCompositeKey() throws Exception {
+        executeUpdate("CREATE TABLE TEST (" +
+            "ID LONG, " +
+            "SEC_ID LONG, " +
+            "NAME VARCHAR, " +
+            "PRIMARY KEY (ID, SEC_ID));");
+
+        checkPKFields("TEST", "ID", "SEC_ID");
+    }
+
+    /**
+     * Checks for composite (so implicitly wrapped) primary key. Additionally, affinity key is used.
+     */
+    @Test
+    public void testCompositeKeyWithAK() throws Exception {
+        final String tpl = "CREATE TABLE TEST (" +
+            "ID LONG, " +
+            "SEC_ID LONG, " +
+            "NAME VARCHAR, " +
+            "PRIMARY KEY (ID, SEC_ID)) " +
+            "WITH \"affinity_key=%s\";";
+
+        executeUpdate(String.format(tpl, "ID"));
+
+        checkPKFields("TEST", "ID", "SEC_ID");
+
+        executeUpdate("DROP TABLE TEST;");
+
+        executeUpdate(String.format(tpl, "SEC_ID"));
+
+        checkPKFields("TEST", "ID", "SEC_ID");
+    }
+
+    /**
+     * Checks that field names in the metadata matches specified expected fields.
+     *
+     * @param tabName part of the sql query after CREATE TABLE TESTER.
+     * @param expPKFields Expected primary key fields.
+     */
+    private void checkPKFields(String tabName, String... expPKFields) throws Exception {
+        try (Connection conn = DriverManager.getConnection(URL)) {
+            DatabaseMetaData md = conn.getMetaData();
+
+            ResultSet rs = md.getPrimaryKeys(conn.getCatalog(), "", tabName);
+
+            List<String> colNames = new ArrayList<>();
+
+            while (rs.next())
+                colNames.add(rs.getString(COL_NAME_IDX));
+
+            assertEquals("Field names in the primary key are not correct",
+                Arrays.asList(expPKFields), colNames);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+
+        super.afterTestsStopped();
+    }
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
index 59382f185470..384b009a3659 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
@@ -49,6 +49,9 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Types.INTEGER;
 import static java.sql.Types.OTHER;
@@ -59,6 +62,7 @@
 /**
  * Metadata tests.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -102,7 +106,7 @@ protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) {
         startGridsMultiThreaded(3);
 
         Map<String, Integer> orgPrecision = new HashMap<>();
-        
+
         orgPrecision.put("name", 42);
 
         IgniteCache<String, Organization> orgCache = jcache(grid(0),
@@ -143,7 +147,7 @@ protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) {
         personCache.put(new AffinityKey<>("p2", "o1"), new Person("Joe Black", 35, 1));
         personCache.put(new AffinityKey<>("p3", "o2"), new Person("Mike Green", 40, 2));
 
-        IgniteCache<Integer, Department> departmentCache = jcache(grid(0), 
+        IgniteCache<Integer, Department> departmentCache = jcache(grid(0),
             defaultCacheConfiguration().setIndexedTypes(Integer.class, Department.class), "dep");
 
         try (Connection conn = DriverManager.getConnection(URL)) {
@@ -161,6 +165,7 @@ protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testResultSetMetaData() throws Exception {
         Connection conn = DriverManager.getConnection(URL);
 
@@ -197,6 +202,7 @@ public void testResultSetMetaData() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetTables() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -241,6 +247,7 @@ public void testGetTables() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAllTables() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -270,6 +277,7 @@ public void testGetAllTables() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetColumns() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             conn.setSchema("pers");
@@ -382,6 +390,7 @@ else if ("_VAL".equals(name)) {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAllColumns() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -430,6 +439,7 @@ public void testGetAllColumns() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInvalidCatalog() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             DatabaseMetaData meta = conn.getMetaData();
@@ -459,6 +469,7 @@ public void testInvalidCatalog() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testIndexMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL);
              ResultSet rs = conn.getMetaData().getIndexInfo(null, "pers", "PERSON", false, false)) {
@@ -497,6 +508,7 @@ else if ("AGE".equals(field))
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAllIndexes() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             ResultSet rs = conn.getMetaData().getIndexInfo(null, null, null, false, false);
@@ -525,6 +537,7 @@ public void testGetAllIndexes() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testPrimaryKeyMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL);
              ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "PERSON")) {
@@ -544,6 +557,7 @@ public void testPrimaryKeyMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testGetAllPrimaryKeys() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             ResultSet rs = conn.getMetaData().getPrimaryKeys(null, null, null);
@@ -555,7 +569,7 @@ public void testGetAllPrimaryKeys() throws Exception {
                 "PUBLIC.TEST.PK_PUBLIC_TEST.ID",
                 "PUBLIC.TEST.PK_PUBLIC_TEST.NAME",
                 "PUBLIC.Quoted.PK_PUBLIC_Quoted.Id",
-                "PUBLIC.TEST_DECIMAL_COLUMN.ID._KEY"));
+                "PUBLIC.TEST_DECIMAL_COLUMN.ID.ID"));
 
             Set<String> actualPks = new HashSet<>(expectedPks.size());
 
@@ -574,6 +588,7 @@ public void testGetAllPrimaryKeys() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testParametersMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             conn.setSchema("\"pers\"");
@@ -598,6 +613,7 @@ public void testParametersMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSchemasMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             ResultSet rs = conn.getMetaData().getSchemas();
@@ -620,6 +636,7 @@ public void testSchemasMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testEmptySchemasMetadata() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             ResultSet rs = conn.getMetaData().getSchemas(null, "qqq");
@@ -631,6 +648,7 @@ public void testEmptySchemasMetadata() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testVersions() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             assert conn.getMetaData().getDatabaseProductVersion().equals(IgniteVersionUtils.VER.toString());
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMissingLongArrayResultsTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMissingLongArrayResultsTest.java
index 633c74bb52c9..6363e13ab8bf 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMissingLongArrayResultsTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMissingLongArrayResultsTest.java
@@ -35,10 +35,14 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcThinMissingLongArrayResultsTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -164,7 +168,8 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
-    @SuppressWarnings({"EmptyTryBlock", "unused"})
+    @SuppressWarnings({"unused"})
+    @Test
     public void testDefaults() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             conn.setSchema('"' + CACHE_NAME + '"');
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinNoDefaultSchemaTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinNoDefaultSchemaTest.java
index 53425c8bbb05..b4f77887b3dd 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinNoDefaultSchemaTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinNoDefaultSchemaTest.java
@@ -32,10 +32,14 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcThinNoDefaultSchemaTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -104,6 +108,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
      * @throws Exception If failed.
      */
     @SuppressWarnings({"EmptyTryBlock", "unused"})
+    @Test
     public void testDefaults() throws Exception {
         try (Connection conn = DriverManager.getConnection(URL)) {
             // No-op.
@@ -117,6 +122,7 @@ public void testDefaults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSchemaNameInQuery() throws Exception {
         Connection conn = DriverManager.getConnection(URL);
 
@@ -155,6 +161,7 @@ public void testSchemaNameInQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSchemaInUrl() throws Exception {
         try(Connection conn = DriverManager.getConnection(URL + "/\"cache1\"")) {
             Statement stmt = conn.createStatement();
@@ -182,6 +189,7 @@ public void testSchemaInUrl() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSchemaInUrlAndInQuery() throws Exception {
         try(Connection conn = DriverManager.getConnection(URL + "/\"cache2\"")) {
             Statement stmt = conn.createStatement();
@@ -201,6 +209,7 @@ public void testSchemaInUrlAndInQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testSetSchema() throws Exception {
         try(Connection conn = DriverManager.getConnection(URL)) {
             // Try to execute query without set schema
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinPreparedStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinPreparedStatementSelfTest.java
index 85efb4d48731..14a2f4d3a53e 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinPreparedStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinPreparedStatementSelfTest.java
@@ -44,6 +44,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static java.sql.Types.BIGINT;
 import static java.sql.Types.BINARY;
@@ -65,6 +68,7 @@
  * Prepared statement test.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinPreparedStatementSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -167,6 +171,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testRepeatableUsage() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where id = ?");
 
@@ -202,6 +207,7 @@ public void testRepeatableUsage() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testQueryExecuteException() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where boolVal is not distinct from ?");
 
@@ -259,6 +265,7 @@ public void testQueryExecuteException() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where boolVal is not distinct from ?");
 
@@ -298,6 +305,7 @@ public void testBoolean() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testByte() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where byteVal is not distinct from ?");
 
@@ -337,6 +345,7 @@ public void testByte() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShort() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where shortVal is not distinct from ?");
 
@@ -376,6 +385,7 @@ public void testShort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInteger() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where intVal is not distinct from ?");
 
@@ -415,6 +425,7 @@ public void testInteger() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLong() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where longVal is not distinct from ?");
 
@@ -454,6 +465,7 @@ public void testLong() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFloat() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where floatVal is not distinct from ?");
 
@@ -493,6 +505,7 @@ public void testFloat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDouble() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where doubleVal is not distinct from ?");
 
@@ -532,6 +545,7 @@ public void testDouble() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimal() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where bigVal is not distinct from ?");
 
@@ -571,6 +585,7 @@ public void testBigDecimal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testString() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where strVal is not distinct from ?");
 
@@ -610,6 +625,7 @@ public void testString() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testArray() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where arrVal is not distinct from ?");
 
@@ -649,6 +665,7 @@ public void testArray() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDate() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where dateVal is not distinct from ?");
 
@@ -688,6 +705,7 @@ public void testDate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTime() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where timeVal is not distinct from ?");
 
@@ -727,6 +745,7 @@ public void testTime() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimestamp() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where tsVal is not distinct from ?");
 
@@ -766,6 +785,7 @@ public void testTimestamp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testClearParameter() throws Exception {
         stmt = conn.prepareStatement(SQL_PART + " where boolVal is not distinct from ?");
 
@@ -789,6 +809,7 @@ public void testClearParameter() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNotSupportedTypes() throws Exception {
         stmt = conn.prepareStatement("");
 
@@ -1050,4 +1071,4 @@ private TestObject(int id) {
             this.id = id;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinResultSetSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinResultSetSelfTest.java
index 36a0a15e92dc..f07f32038c70 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinResultSetSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinResultSetSelfTest.java
@@ -46,6 +46,9 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -54,6 +57,7 @@
  * Result set test.
  */
 @SuppressWarnings({"FloatingPointEquality", "ThrowableNotThrown", "AssertWithSideEffects"})
+@RunWith(JUnit4.class)
 public class JdbcThinResultSetSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -163,6 +167,7 @@ private TestObject createObjectWithData(int id) throws MalformedURLException {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBoolean() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -243,6 +248,7 @@ public void testBoolean() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testByte() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -282,6 +288,7 @@ public void testByte() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testShort() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -321,6 +328,7 @@ public void testShort() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testInteger() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -360,6 +368,7 @@ public void testInteger() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLong() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -399,6 +408,7 @@ public void testLong() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFloat() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -438,6 +448,7 @@ public void testFloat() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testDouble() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -477,6 +488,7 @@ public void testDouble() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimal() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -516,6 +528,7 @@ public void testBigDecimal() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testBigDecimalScale() throws Exception {
         assert "0.12".equals(convertStringToBigDecimalViaJdbc("0.1234", 2).toString());
         assert "1.001".equals(convertStringToBigDecimalViaJdbc("1.0005", 3).toString());
@@ -540,6 +553,7 @@ private BigDecimal convertStringToBigDecimalViaJdbc(String strDec, int scale) th
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testString() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -579,6 +593,7 @@ public void testString() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testArray() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -600,6 +615,7 @@ public void testArray() throws Exception {
      * @throws Exception If failed.
      */
     @SuppressWarnings("deprecation")
+    @Test
     public void testDate() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -628,6 +644,7 @@ public void testDate() throws Exception {
      * @throws Exception If failed.
      */
     @SuppressWarnings("deprecation")
+    @Test
     public void testTime() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -655,6 +672,7 @@ public void testTime() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testTimestamp() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -682,6 +700,7 @@ public void testTimestamp() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testObjectNotSupported() throws Exception {
         GridTestUtils.assertThrowsAnyCause(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -695,6 +714,7 @@ public void testObjectNotSupported() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNavigation() throws Exception {
         ResultSet rs = stmt.executeQuery("select id from TestObject where id > 0");
 
@@ -736,6 +756,7 @@ public void testNavigation() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testFindColumn() throws Exception {
         final ResultSet rs = stmt.executeQuery(SQL);
 
@@ -761,6 +782,7 @@ public void testFindColumn() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testNotSupportedTypes() throws Exception {
         final ResultSet rs = stmt.executeQuery(SQL);
 
@@ -902,6 +924,7 @@ public void testNotSupportedTypes() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testUpdateNotSupported() throws Exception {
         final ResultSet rs = stmt.executeQuery(SQL);
 
@@ -1409,6 +1432,7 @@ public void testUpdateNotSupported() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testExceptionOnClosedResultSet() throws Exception {
         final ResultSet rs = stmt.executeQuery(SQL);
 
@@ -1842,4 +1866,4 @@ private TestObjectField(int a, String b) {
             return S.toString(TestObjectField.class, this);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSchemaCaseTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSchemaCaseTest.java
index 8f1108743cdd..c1110a0f9878 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSchemaCaseTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSchemaCaseTest.java
@@ -29,10 +29,14 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcThinSchemaCaseTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -90,7 +94,8 @@ private CacheConfiguration cacheConfiguration(@NotNull String name, @NotNull Str
     /**
      * @throws Exception If failed.
      */
-    @SuppressWarnings({"EmptyTryBlock", "unused"})
+    @SuppressWarnings({"unused"})
+    @Test
     public void testSchemaName() throws Exception {
         checkSchemaConnection("test0");
         checkSchemaConnection("test1");
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSelectAfterAlterTable.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSelectAfterAlterTable.java
index ef711dcfd1e9..0bc8f2c6bce6 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSelectAfterAlterTable.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinSelectAfterAlterTable.java
@@ -32,10 +32,14 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Base class for complex SQL tests based on JDBC driver.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinSelectAfterAlterTable extends GridCommonAbstractTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -119,7 +123,7 @@ private CacheConfiguration cacheConfiguration(@NotNull String name) throws Excep
     /**
      * @throws Exception If failed.
      */
-    @SuppressWarnings({"ThrowableResultOfMethodCallIgnored", "unchecked"})
+    @Test
     public void testSelectAfterAlterTableSingleNode() throws Exception {
         stmt.executeUpdate("alter table person add age int");
 
@@ -129,7 +133,7 @@ public void testSelectAfterAlterTableSingleNode() throws Exception {
     /**
      * @throws Exception If failed.
      */
-    @SuppressWarnings({"ThrowableResultOfMethodCallIgnored", "unchecked"})
+    @Test
     public void testSelectAfterAlterTableMultiNode() throws Exception {
         try (Connection conn2 = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:"
             + (ClientConnectorConfiguration.DFLT_PORT + 1))) {
@@ -165,4 +169,4 @@ public void checkNewColumn(Statement stmt) throws SQLException {
 
         assertTrue(newColExists);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStatementSelfTest.java
index 6d6e72db0b08..224cfdf6fab3 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStatementSelfTest.java
@@ -37,6 +37,8 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -44,7 +46,8 @@
 /**
  * Statement test.
  */
-@SuppressWarnings({"ThrowableNotThrown", "ThrowableResultOfMethodCallIgnored"})
+@SuppressWarnings({"ThrowableNotThrown"})
+@RunWith(JUnit4.class)
 public class JdbcThinStatementSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -124,6 +127,7 @@
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteQuery0() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -156,6 +160,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteQuery1() throws Exception {
         final String sqlText = "select val from test";
 
@@ -182,6 +187,7 @@ public void testExecuteQuery1() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecute() throws Exception {
         assert stmt.execute(SQL);
 
@@ -220,6 +226,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testMaxRows() throws Exception {
         stmt.setMaxRows(1);
 
@@ -285,6 +292,7 @@ else if (id == 3) {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCloseResultSet0() throws Exception {
         ResultSet rs0 = stmt.executeQuery(SQL);
         ResultSet rs1 = stmt.executeQuery(SQL);
@@ -303,6 +311,7 @@ public void testCloseResultSet0() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCloseResultSet1() throws Exception {
         stmt.execute(SQL);
 
@@ -316,6 +325,7 @@ public void testCloseResultSet1() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCloseResultSetByConnectionClose() throws Exception {
         ResultSet rs = stmt.executeQuery(SQL);
 
@@ -328,6 +338,7 @@ public void testCloseResultSetByConnectionClose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCloseOnCompletionAfterQuery() throws Exception {
         assert !stmt.isCloseOnCompletion() : "Invalid default closeOnCompletion";
 
@@ -357,6 +368,7 @@ public void testCloseOnCompletionAfterQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCloseOnCompletionBeforeQuery() throws Exception {
         assert !stmt.isCloseOnCompletion() : "Invalid default closeOnCompletion";
 
@@ -386,6 +398,7 @@ public void testCloseOnCompletionBeforeQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteQueryTimeout() throws Exception {
         fail("https://issues.apache.org/jira/browse/IGNITE-5438");
 
@@ -408,6 +421,7 @@ public void testExecuteQueryTimeout() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteQueryMultipleOnlyResultSets() throws Exception {
         assert conn.getMetaData().supportsMultipleResultSets();
 
@@ -436,6 +450,7 @@ public void testExecuteQueryMultipleOnlyResultSets() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteQueryMultipleOnlyDml() throws Exception {
         conn.setSchema(null);
 
@@ -471,6 +486,7 @@ public void testExecuteQueryMultipleOnlyDml() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteQueryMultipleMixed() throws Exception {
         conn.setSchema(null);
 
@@ -531,6 +547,7 @@ public void testExecuteQueryMultipleMixed() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteUpdate() throws Exception {
         final String sqlText = "update test set val=1 where _key=1";
 
@@ -548,6 +565,7 @@ public void testExecuteUpdate() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteUpdateProducesResultSet() throws Exception {
         final String sqlText = "select * from test";
 
@@ -565,6 +583,7 @@ public void testExecuteUpdateProducesResultSet() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testExecuteUpdateTimeout() throws Exception {
         fail("https://issues.apache.org/jira/browse/IGNITE-5438");
 
@@ -587,6 +606,7 @@ public void testExecuteUpdateTimeout() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testClose() throws Exception {
         String sqlText = "select * from test";
 
@@ -609,6 +629,7 @@ public void testClose() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testGetSetMaxFieldSizeUnsupported() throws Exception {
         assertEquals(0, stmt.getMaxFieldSize());
 
@@ -646,6 +667,7 @@ public void testGetSetMaxFieldSizeUnsupported() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testGetSetMaxRows() throws Exception {
         assertEquals(0, stmt.getMaxRows());
 
@@ -696,6 +718,7 @@ public void testGetSetMaxRows() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testSetEscapeProcessing() throws Exception {
         fail("https://issues.apache.org/jira/browse/IGNITE-5440");
 
@@ -733,6 +756,7 @@ public void testSetEscapeProcessing() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testGetSetQueryTimeout() throws Exception {
         assertEquals(0, stmt.getQueryTimeout());
 
@@ -777,6 +801,7 @@ public void testGetSetQueryTimeout() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testMaxFieldSize() throws Exception {
         assert stmt.getMaxFieldSize() >= 0;
 
@@ -802,6 +827,7 @@ public void testMaxFieldSize() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testQueryTimeout() throws Exception {
         assert stmt.getQueryTimeout() == 0 : "Default timeout invalid: " + stmt.getQueryTimeout();
 
@@ -827,6 +853,7 @@ public void testQueryTimeout() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testWarningsOnClosedStatement() throws Exception {
         stmt.clearWarnings();
 
@@ -850,6 +877,7 @@ public void testWarningsOnClosedStatement() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCursorName() throws Exception {
         checkNotSupported(new RunnableX() {
             @Override public void run() throws Exception {
@@ -869,6 +897,7 @@ public void testCursorName() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testGetMoreResults() throws Exception {
         assert !stmt.getMoreResults();
 
@@ -894,6 +923,7 @@ public void testGetMoreResults() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testGetMoreResults1() throws Exception {
         assert !stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT);
         assert !stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);
@@ -921,8 +951,11 @@ public void testGetMoreResults1() throws Exception {
     }
 
     /**
+     * Verifies that emty batch can be performed.
+     *
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testBatchEmpty() throws Exception {
         assert conn.getMetaData().supportsBatchUpdates();
 
@@ -945,6 +978,7 @@ public void testBatchEmpty() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testFetchDirection() throws Exception {
         assert stmt.getFetchDirection() == ResultSet.FETCH_FORWARD;
 
@@ -978,6 +1012,7 @@ public void testFetchDirection() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testAutogenerated() throws Exception {
         GridTestUtils.assertThrows(log,
             new Callable<Object>() {
@@ -1049,6 +1084,7 @@ public void testAutogenerated() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testCancel() throws Exception {
         fail("https://issues.apache.org/jira/browse/IGNITE-5439");
 
@@ -1095,6 +1131,7 @@ public void testCancel() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testStatementTypeMismatchSelectForCachedQuery() throws Exception {
         // Put query to cache.
         stmt.executeQuery("select 1;");
@@ -1116,6 +1153,7 @@ public void testStatementTypeMismatchSelectForCachedQuery() throws Exception {
     /**
      * @throws Exception If failed.
      */
+    @org.junit.Test
     public void testStatementTypeMismatchUpdate() throws Exception {
         GridTestUtils.assertThrows(log,
             new Callable<Object>() {
@@ -1224,4 +1262,4 @@ private Person(int id, String firstName, String lastName, int age) {
             this.age = age;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStreamingAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStreamingAbstractSelfTest.java
index c83977c692d1..70dc7815f816 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStreamingAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinStreamingAbstractSelfTest.java
@@ -40,10 +40,14 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for streaming via thin driver.
  */
+@RunWith(JUnit4.class)
 public abstract class JdbcThinStreamingAbstractSelfTest extends JdbcStreamingSelfTest {
     /** */
     protected int batchSize = 17;
@@ -96,6 +100,7 @@
     /**
      * @throws Exception if failed.
      */
+    @Test
     public void testStreamedBatchedInsert() throws Exception {
         for (int i = 10; i <= 100; i += 10)
             put(i, nameForId(i * 100));
@@ -132,6 +137,7 @@ public void testStreamedBatchedInsert() throws Exception {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testSimultaneousStreaming() throws Exception {
         try (Connection anotherConn = createOrdinaryConnection()) {
             execute(anotherConn, "CREATE TABLE PUBLIC.T(x int primary key, y int) WITH " +
@@ -212,6 +218,7 @@ public void testSimultaneousStreaming() throws Exception {
     /**
      *
      */
+    @Test
     public void testStreamingWithMixedStatementTypes() throws Exception {
         String prepStmtStr = "insert into Person(\"id\", \"name\") values (?, ?)";
 
@@ -268,6 +275,7 @@ public void testStreamingWithMixedStatementTypes() throws Exception {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testStreamingOffToOn() throws Exception {
         try (Connection conn = createOrdinaryConnection()) {
             assertStreamingState(false);
@@ -281,6 +289,7 @@ public void testStreamingOffToOn() throws Exception {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testStreamingOffToOff() throws Exception {
         try (Connection conn = createOrdinaryConnection()) {
             assertStreamingState(false);
@@ -294,6 +303,7 @@ public void testStreamingOffToOff() throws Exception {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testStreamingOnToOff() throws Exception {
         try (Connection conn = createStreamedConnection(false)) {
             assertStreamingState(true);
@@ -307,6 +317,7 @@ public void testStreamingOnToOff() throws Exception {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testFlush() throws Exception {
         try (Connection conn = createStreamedConnection(false, 10000)) {
             assertStreamingState(true);
@@ -337,6 +348,7 @@ public void testFlush() throws Exception {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testStreamingReEnabled() throws Exception {
         try (Connection conn = createStreamedConnection(false, 10000)) {
             assertStreamingState(true);
@@ -381,6 +393,7 @@ public void testStreamingReEnabled() throws Exception {
      *
      */
     @SuppressWarnings("ThrowableNotThrown")
+    @Test
     public void testNonStreamedBatch() {
         GridTestUtils.assertThrows(null, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -407,6 +420,7 @@ public void testNonStreamedBatch() {
      *
      */
     @SuppressWarnings("ThrowableNotThrown")
+    @Test
     public void testStreamingStatementInTheMiddleOfNonPreparedBatch() {
         GridTestUtils.assertThrows(null, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -428,6 +442,7 @@ public void testStreamingStatementInTheMiddleOfNonPreparedBatch() {
      *
      */
     @SuppressWarnings("ThrowableNotThrown")
+    @Test
     public void testBatchingSetStreamingStatement() {
         GridTestUtils.assertThrows(null, new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -513,4 +528,4 @@ protected void assertStreamingState(boolean on) throws Exception {
             return super.querySqlFields(schemaName, qry, cliCtx, keepBinary, failOnMultipleStmts, tracker, cancel);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTcpIoTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTcpIoTest.java
index fc3704b6b7b5..dab2d88d95c8 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTcpIoTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTcpIoTest.java
@@ -32,11 +32,14 @@
 import org.apache.ignite.internal.util.HostAndPortRange;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for JdbcThinTcpIo.
  */
-@SuppressWarnings("ThrowableNotThrown")
+@RunWith(JUnit4.class)
 public class JdbcThinTcpIoTest extends GridCommonAbstractTest {
     /** Server port range. */
     private static final int[] SERVER_PORT_RANGE = {59000, 59020};
@@ -116,6 +119,7 @@ private JdbcThinTcpIo createTcpIo(String[] addrs, int port) throws SQLException
      * @throws SQLException On connection error or reject.
      * @throws IOException On IO error in handshake.
      */
+    @Test
     public void testHostWithManyAddresses() throws SQLException, IOException, InterruptedException {
         CountDownLatch connectionAccepted = new CountDownLatch(1);
 
@@ -142,6 +146,7 @@ public void testHostWithManyAddresses() throws SQLException, IOException, Interr
      * @throws SQLException On connection error or reject.
      * @throws IOException On IO error in handshake.
      */
+    @Test
     public void testExceptionMessage() throws SQLException, IOException {
         try (ServerSocket sock = createServerSocket(null)) {
             String[] addrs = {INACCESSIBLE_ADDRESSES[0], INACCESSIBLE_ADDRESSES[1]};
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsAbstractComplexSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsAbstractComplexSelfTest.java
index 68ed36b08647..6b0e17865d49 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsAbstractComplexSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsAbstractComplexSelfTest.java
@@ -44,13 +44,17 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test to check various transactional scenarios.
  */
+@RunWith(JUnit4.class)
 public abstract class JdbcThinTransactionsAbstractComplexSelfTest extends JdbcThinAbstractSelfTest {
     /** Client node index. */
-    final static int CLI_IDX = 1;
+    static final int CLI_IDX = 1;
 
     /**
      * Closure to perform ordinary delete after repeatable read.
@@ -227,6 +231,7 @@
     /**
      *
      */
+    @Test
     public void testSingleDmlStatement() throws SQLException {
         insertPerson(6, "John", "Doe", 2, 2);
 
@@ -237,6 +242,7 @@ public void testSingleDmlStatement() throws SQLException {
     /**
      *
      */
+    @Test
     public void testMultipleDmlStatements() throws SQLException {
         executeInTransaction(new TransactionClosure() {
             @Override public void apply(Connection conn) {
@@ -259,6 +265,7 @@ public void testMultipleDmlStatements() throws SQLException {
     /**
      *
      */
+    @Test
     public void testBatchDmlStatements() throws SQLException {
         doBatchedInsert();
 
@@ -271,7 +278,7 @@ public void testBatchDmlStatements() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testBatchDmlStatementsIntermediateFailure() throws SQLException {
         insertPerson(6, "John", "Doe", 2, 2);
 
@@ -339,6 +346,7 @@ private void doBatchedInsert() throws SQLException {
     /**
      *
      */
+    @Test
     public void testInsertAndQueryMultipleCaches() throws SQLException {
         executeInTransaction(new TransactionClosure() {
             @Override public void apply(Connection conn) {
@@ -360,6 +368,7 @@ public void testInsertAndQueryMultipleCaches() throws SQLException {
     /**
      *
      */
+    @Test
     public void testColocatedJoinSelectAndInsertInTransaction() throws SQLException {
         // We'd like to put some Google into cities with over 1K population which don't have it yet
         executeInTransaction(new TransactionClosure() {
@@ -383,6 +392,7 @@ public void testColocatedJoinSelectAndInsertInTransaction() throws SQLException
     /**
      *
      */
+    @Test
     public void testDistributedJoinSelectAndInsertInTransaction() throws SQLException {
         try (Connection c = connect("distributedJoins=true")) {
             // We'd like to put some Google into cities with over 1K population which don't have it yet
@@ -408,6 +418,7 @@ public void testDistributedJoinSelectAndInsertInTransaction() throws SQLExceptio
     /**
      *
      */
+    @Test
     public void testInsertFromExpression() throws SQLException {
         executeInTransaction(new TransactionClosure() {
             @Override public void apply(Connection conn) {
@@ -420,6 +431,7 @@ public void testInsertFromExpression() throws SQLException {
     /**
      *
      */
+    @Test
     public void testAutoRollback() throws SQLException {
         try (Connection c = connect()) {
             begin(c);
@@ -435,6 +447,7 @@ public void testAutoRollback() throws SQLException {
     /**
      *
      */
+    @Test
     public void testRepeatableReadWithConcurrentDelete() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -446,6 +459,7 @@ public void testRepeatableReadWithConcurrentDelete() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadWithConcurrentFastDelete() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -457,6 +471,7 @@ public void testRepeatableReadWithConcurrentFastDelete() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadWithConcurrentCacheRemove() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -468,6 +483,7 @@ public void testRepeatableReadWithConcurrentCacheRemove() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndDeleteWithConcurrentDelete() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -479,6 +495,7 @@ public void testRepeatableReadAndDeleteWithConcurrentDelete() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndDeleteWithConcurrentFastDelete() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -490,6 +507,7 @@ public void testRepeatableReadAndDeleteWithConcurrentFastDelete() throws Excepti
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndDeleteWithConcurrentCacheRemove() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -501,6 +519,7 @@ public void testRepeatableReadAndDeleteWithConcurrentCacheRemove() throws Except
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndFastDeleteWithConcurrentDelete() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -512,6 +531,7 @@ public void testRepeatableReadAndFastDeleteWithConcurrentDelete() throws Excepti
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndFastDeleteWithConcurrentFastDelete() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -523,6 +543,7 @@ public void testRepeatableReadAndFastDeleteWithConcurrentFastDelete() throws Exc
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndFastDeleteWithConcurrentCacheRemove() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -534,6 +555,7 @@ public void testRepeatableReadAndFastDeleteWithConcurrentCacheRemove() throws Ex
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndDeleteWithConcurrentDeleteAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -545,6 +567,7 @@ public void testRepeatableReadAndDeleteWithConcurrentDeleteAndRollback() throws
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndDeleteWithConcurrentFastDeleteAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -556,6 +579,7 @@ public void testRepeatableReadAndDeleteWithConcurrentFastDeleteAndRollback() thr
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndDeleteWithConcurrentCacheRemoveAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -567,6 +591,7 @@ public void testRepeatableReadAndDeleteWithConcurrentCacheRemoveAndRollback() th
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndFastDeleteWithConcurrentDeleteAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -578,6 +603,7 @@ public void testRepeatableReadAndFastDeleteWithConcurrentDeleteAndRollback() thr
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndFastDeleteWithConcurrentFastDeleteAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -589,6 +615,7 @@ public void testRepeatableReadAndFastDeleteWithConcurrentFastDeleteAndRollback()
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndFastDeleteWithConcurrentCacheRemoveAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -600,6 +627,7 @@ public void testRepeatableReadAndFastDeleteWithConcurrentCacheRemoveAndRollback(
     /**
      *
      */
+    @Test
     public void testRepeatableReadWithConcurrentUpdate() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -611,6 +639,7 @@ public void testRepeatableReadWithConcurrentUpdate() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadWithConcurrentCacheReplace() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -628,6 +657,7 @@ public void testRepeatableReadWithConcurrentCacheReplace() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndUpdateWithConcurrentUpdate() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -639,6 +669,7 @@ public void testRepeatableReadAndUpdateWithConcurrentUpdate() throws Exception {
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndUpdateWithConcurrentCacheReplace() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -656,6 +687,7 @@ public void testRepeatableReadAndUpdateWithConcurrentCacheReplace() throws Excep
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndUpdateWithConcurrentUpdateAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -667,6 +699,7 @@ public void testRepeatableReadAndUpdateWithConcurrentUpdateAndRollback() throws
     /**
      *
      */
+    @Test
     public void testRepeatableReadAndUpdateWithConcurrentCacheReplaceAndRollback() throws Exception {
         doTestRepeatableRead(new IgniteInClosure<Connection>() {
             @Override public void apply(Connection conn) {
@@ -688,7 +721,6 @@ public void testRepeatableReadAndUpdateWithConcurrentCacheReplaceAndRollback() t
      *     (must yield an exception).
      * @throws Exception if failed.
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
     private void doTestRepeatableRead(final IgniteInClosure<Connection> concurrentWriteClo,
         final IgniteInClosure<Connection> afterReadClo) throws Exception {
         final CountDownLatch repeatableReadLatch = new CountDownLatch(1);
@@ -755,11 +787,11 @@ private void doTestRepeatableRead(final IgniteInClosure<Connection> concurrentWr
 
                     return null;
                 }
-            }, IgniteCheckedException.class, "Mvcc version mismatch.");
+            }, IgniteCheckedException.class, "Cannot serialize transaction due to write conflict");
 
             assertTrue(X.hasCause(ex, SQLException.class));
 
-            assertTrue(X.getCause(ex).getMessage().contains("Mvcc version mismatch."));
+            assertTrue(X.getCause(ex).getMessage().contains("Cannot serialize transaction due to write conflict"));
         }
         else
             readFut.get();
@@ -1016,7 +1048,7 @@ private void insertProduct(Connection c, int id, String name, int companyId) {
     /**
      * Person class.
      */
-    private final static class Person {
+    private static final class Person {
         /** */
         @QuerySqlField
         public int id;
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
index a8fa47b7df2a..143a14c26f14 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsSelfTest.java
@@ -40,10 +40,14 @@
 import org.apache.ignite.testframework.GridStringLogger;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests to check behavior with transactions on.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinTransactionsSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -55,11 +59,11 @@
     private GridStringLogger log;
 
     /** {@inheritDoc} */
-    @SuppressWarnings("deprecation")
+    @SuppressWarnings({"deprecation", "unchecked"})
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
-        cfg.setCacheConfiguration(cacheConfiguration(DEFAULT_CACHE_NAME));
+        cfg.setCacheConfiguration(cacheConfiguration(DEFAULT_CACHE_NAME).setNearConfiguration(null));
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
@@ -124,6 +128,7 @@ private static Connection c(boolean autoCommit, NestedTxMode nestedTxMode) throw
     /**
      *
      */
+    @Test
     public void testTransactionsBeginCommitRollback() throws IgniteCheckedException {
         final AtomicBoolean stop = new AtomicBoolean();
 
@@ -160,6 +165,7 @@ public void testTransactionsBeginCommitRollback() throws IgniteCheckedException
     /**
      *
      */
+    @Test
     public void testTransactionsBeginCommitRollbackAutocommit() throws IgniteCheckedException {
         GridTestUtils.runMultiThreadedAsync(new Runnable() {
             @Override public void run() {
@@ -186,7 +192,7 @@ public void testTransactionsBeginCommitRollbackAutocommit() throws IgniteChecked
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOff() throws SQLException {
         try (Connection c = c(false, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, false);
@@ -198,7 +204,7 @@ public void testIgnoreNestedTxAutocommitOff() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOff() throws SQLException {
         try (Connection c = c(false, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, false);
@@ -210,7 +216,7 @@ public void testCommitNestedTxAutocommitOff() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testErrorNestedTxAutocommitOff() throws SQLException {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
@@ -226,7 +232,7 @@ public void testErrorNestedTxAutocommitOff() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOn() throws SQLException {
         try (Connection c = c(true, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, false);
@@ -238,7 +244,7 @@ public void testIgnoreNestedTxAutocommitOn() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOn() throws SQLException {
         try (Connection c = c(true, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, false);
@@ -250,7 +256,7 @@ public void testCommitNestedTxAutocommitOn() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testErrorNestedTxAutocommitOn() throws SQLException {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
@@ -266,7 +272,7 @@ public void testErrorNestedTxAutocommitOn() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOffBatched() throws SQLException {
         try (Connection c = c(false, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, true);
@@ -278,7 +284,7 @@ public void testIgnoreNestedTxAutocommitOffBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOffBatched() throws SQLException {
         try (Connection c = c(false, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, true);
@@ -290,7 +296,7 @@ public void testCommitNestedTxAutocommitOffBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testErrorNestedTxAutocommitOffBatched() throws SQLException {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
@@ -306,7 +312,7 @@ public void testErrorNestedTxAutocommitOffBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOnBatched() throws SQLException {
         try (Connection c = c(true, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, true);
@@ -318,7 +324,7 @@ public void testIgnoreNestedTxAutocommitOnBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOnBatched() throws SQLException {
         try (Connection c = c(true, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, true);
@@ -330,7 +336,7 @@ public void testCommitNestedTxAutocommitOnBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testErrorNestedTxAutocommitOnBatched() throws SQLException {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
@@ -371,6 +377,7 @@ private void doNestedTxStart(Connection conn, boolean batched) throws SQLExcepti
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testAutoCommitSingle() throws SQLException {
         doTestAutoCommit(false);
     }
@@ -378,6 +385,7 @@ public void testAutoCommitSingle() throws SQLException {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testAutoCommitBatched() throws SQLException {
         doTestAutoCommit(true);
     }
@@ -422,7 +430,7 @@ private void doTestAutoCommit(boolean batched) throws SQLException {
      * Test that exception in one of the statements does not kill connection worker altogether.
      * @throws SQLException if failed.
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testExceptionHandling() throws SQLException {
         try (Connection c = c(true, NestedTxMode.ERROR)) {
             try (Statement s = c.createStatement()) {
@@ -444,4 +452,32 @@ public void testExceptionHandling() throws SQLException {
             }
         }
     }
+
+    /**
+     * Test that exception in one of the statements does not kill connection worker altogether.
+     * @throws SQLException if failed.
+     */
+    @Test
+    public void testParsingErrorHasNoSideEffect() throws SQLException {
+        try (Connection c = c(false, NestedTxMode.ERROR)) {
+            try (Statement s = c.createStatement()) {
+                s.execute("INSERT INTO INTS(k, v) values(1, 1)");
+
+                GridTestUtils.assertThrows(null, new Callable<Void>() {
+                    @Override public Void call() throws Exception {
+                        s.execute("INSERT INTO INTS(k, v) values(1)");
+
+                        return null;
+                    }
+                }, SQLException.class, "Failed to parse query");
+
+                s.execute("INSERT INTO INTS(k, v) values(2, 2)");
+
+                c.commit();
+            }
+
+            assertEquals(1, grid(0).cache("ints").get(1));
+            assertEquals(2, grid(0).cache("ints").get(2));
+        }
+    }
 }
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsWithMvccEnabledSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsWithMvccEnabledSelfTest.java
index e01a53dc59e9..dea855f07fc7 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsWithMvccEnabledSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinTransactionsWithMvccEnabledSelfTest.java
@@ -40,10 +40,14 @@
 import org.apache.ignite.testframework.GridStringLogger;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests to check behavior with transactions on.
  */
+@RunWith(JUnit4.class)
 public class JdbcThinTransactionsWithMvccEnabledSelfTest extends JdbcThinAbstractSelfTest {
     /** IP finder. */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
@@ -55,11 +59,11 @@
     private GridStringLogger log;
 
     /** {@inheritDoc} */
-    @SuppressWarnings("deprecation")
+    @SuppressWarnings({"deprecation", "unchecked"})
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
-        cfg.setCacheConfiguration(cacheConfiguration(DEFAULT_CACHE_NAME));
+        cfg.setCacheConfiguration(cacheConfiguration(DEFAULT_CACHE_NAME).setNearConfiguration(null));
 
         TcpDiscoverySpi disco = new TcpDiscoverySpi();
 
@@ -77,9 +81,8 @@
     /**
      * @param name Cache name.
      * @return Cache configuration.
-     * @throws Exception In case of error.
      */
-    private CacheConfiguration cacheConfiguration(@NotNull String name) throws Exception {
+    private CacheConfiguration cacheConfiguration(@NotNull String name) {
         CacheConfiguration cfg = defaultCacheConfiguration();
 
         cfg.setName(name);
@@ -124,6 +127,7 @@ private static Connection c(boolean autoCommit, NestedTxMode nestedTxMode) throw
     /**
      *
      */
+    @Test
     public void testTransactionsBeginCommitRollback() throws IgniteCheckedException {
         final AtomicBoolean stop = new AtomicBoolean();
 
@@ -160,6 +164,7 @@ public void testTransactionsBeginCommitRollback() throws IgniteCheckedException
     /**
      *
      */
+    @Test
     public void testTransactionsBeginCommitRollbackAutocommit() throws IgniteCheckedException {
         GridTestUtils.runMultiThreadedAsync(new Runnable() {
             @Override public void run() {
@@ -186,7 +191,7 @@ public void testTransactionsBeginCommitRollbackAutocommit() throws IgniteChecked
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOff() throws SQLException {
         try (Connection c = c(false, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, false);
@@ -198,7 +203,7 @@ public void testIgnoreNestedTxAutocommitOff() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOff() throws SQLException {
         try (Connection c = c(false, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, false);
@@ -210,8 +215,8 @@ public void testCommitNestedTxAutocommitOff() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    public void testErrorNestedTxAutocommitOff() throws SQLException {
+    @Test
+    public void testErrorNestedTxAutocommitOff() {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
                 try (Connection c = c(false, NestedTxMode.ERROR)) {
@@ -226,7 +231,7 @@ public void testErrorNestedTxAutocommitOff() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOn() throws SQLException {
         try (Connection c = c(true, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, false);
@@ -238,7 +243,7 @@ public void testIgnoreNestedTxAutocommitOn() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOn() throws SQLException {
         try (Connection c = c(true, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, false);
@@ -250,8 +255,8 @@ public void testCommitNestedTxAutocommitOn() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    public void testErrorNestedTxAutocommitOn() throws SQLException {
+    @Test
+    public void testErrorNestedTxAutocommitOn() {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
                 try (Connection c = c(true, NestedTxMode.ERROR)) {
@@ -266,7 +271,7 @@ public void testErrorNestedTxAutocommitOn() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOffBatched() throws SQLException {
         try (Connection c = c(false, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, true);
@@ -278,7 +283,7 @@ public void testIgnoreNestedTxAutocommitOffBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOffBatched() throws SQLException {
         try (Connection c = c(false, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, true);
@@ -290,8 +295,8 @@ public void testCommitNestedTxAutocommitOffBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    public void testErrorNestedTxAutocommitOffBatched() throws SQLException {
+    @Test
+    public void testErrorNestedTxAutocommitOffBatched() {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
                 try (Connection c = c(false, NestedTxMode.ERROR)) {
@@ -306,7 +311,7 @@ public void testErrorNestedTxAutocommitOffBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testIgnoreNestedTxAutocommitOnBatched() throws SQLException {
         try (Connection c = c(true, NestedTxMode.IGNORE)) {
             doNestedTxStart(c, true);
@@ -318,7 +323,7 @@ public void testIgnoreNestedTxAutocommitOnBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testCommitNestedTxAutocommitOnBatched() throws SQLException {
         try (Connection c = c(true, NestedTxMode.COMMIT)) {
             doNestedTxStart(c, true);
@@ -330,8 +335,8 @@ public void testCommitNestedTxAutocommitOnBatched() throws SQLException {
     /**
      *
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    public void testErrorNestedTxAutocommitOnBatched() throws SQLException {
+    @Test
+    public void testErrorNestedTxAutocommitOnBatched() {
         GridTestUtils.assertThrows(null, new Callable<Void>() {
             @Override public Void call() throws Exception {
                 try (Connection c = c(true, NestedTxMode.ERROR)) {
@@ -371,6 +376,7 @@ private void doNestedTxStart(Connection conn, boolean batched) throws SQLExcepti
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testAutoCommitSingle() throws SQLException {
         doTestAutoCommit(false);
     }
@@ -378,6 +384,7 @@ public void testAutoCommitSingle() throws SQLException {
     /**
      * @throws SQLException if failed.
      */
+    @Test
     public void testAutoCommitBatched() throws SQLException {
         doTestAutoCommit(true);
     }
@@ -422,7 +429,7 @@ private void doTestAutoCommit(boolean batched) throws SQLException {
      * Test that exception in one of the statements does not kill connection worker altogether.
      * @throws SQLException if failed.
      */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    @Test
     public void testExceptionHandling() throws SQLException {
         try (Connection c = c(true, NestedTxMode.ERROR)) {
             try (Statement s = c.createStatement()) {
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinUpdateStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinUpdateStatementSelfTest.java
index f749dbeba7bf..1f5fd8564b07 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinUpdateStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinUpdateStatementSelfTest.java
@@ -21,14 +21,19 @@
 import java.util.Arrays;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.internal.util.typedef.F;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *
  */
+@RunWith(JUnit4.class)
 public class JdbcThinUpdateStatementSelfTest extends JdbcThinAbstractUpdateStatementSelfTest {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecute() throws SQLException {
         conn.createStatement().execute("update Person set firstName = 'Jack' where " +
             "cast(substring(_key, 2, 1) as int) % 2 = 0");
@@ -40,6 +45,7 @@ public void testExecute() throws SQLException {
     /**
      * @throws SQLException If failed.
      */
+    @Test
     public void testExecuteUpdate() throws SQLException {
         conn.createStatement().executeUpdate("update Person set firstName = 'Jack' where " +
                 "cast(substring(_key, 2, 1) as int) % 2 = 0");
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/MvccJdbcTransactionFinishOnDeactivatedClusterSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/MvccJdbcTransactionFinishOnDeactivatedClusterSelfTest.java
new file mode 100644
index 000000000000..dab44bfa38ba
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/MvccJdbcTransactionFinishOnDeactivatedClusterSelfTest.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.jdbc.thin;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.Collections;
+import java.util.concurrent.CountDownLatch;
+import org.apache.ignite.configuration.ConnectorConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.client.GridClient;
+import org.apache.ignite.internal.client.GridClientClusterState;
+import org.apache.ignite.internal.client.GridClientConfiguration;
+import org.apache.ignite.internal.client.GridClientFactory;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** */
+@RunWith(JUnit4.class)
+public class MvccJdbcTransactionFinishOnDeactivatedClusterSelfTest extends GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        cleanPersistenceDir();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        return super.getConfiguration(igniteInstanceName)
+            .setConnectorConfiguration(new ConnectorConfiguration())
+            .setDataStorageConfiguration(new DataStorageConfiguration().setDefaultDataRegionConfiguration(
+                new DataRegionConfiguration().setPersistenceEnabled(true))
+            );
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testTxCommitAfterDeactivation() throws Exception {
+        checkTxFinishAfterDeactivation(true);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testTxRollbackAfterDeactivation() throws Exception {
+        checkTxFinishAfterDeactivation(false);
+    }
+
+    /** */
+    public void checkTxFinishAfterDeactivation(boolean commit) throws Exception {
+        IgniteEx node0 = startGrid(0);
+
+        node0.cluster().active(true);
+
+        try (Connection conn = connect()) {
+            execute(conn, "CREATE TABLE t1(a INT, b VARCHAR, PRIMARY KEY(a)) WITH \"atomicity=TRANSACTIONAL_SNAPSHOT,backups=1\"");
+        }
+
+        final CountDownLatch enlistedLatch = new CountDownLatch(1);
+
+        assert node0.cluster().active();
+
+        IgniteInternalFuture txFinishedFut = GridTestUtils.runAsync(() -> {
+            executeTransaction(commit, enlistedLatch, () -> !node0.context().state().publicApiActiveState(true));
+
+            return null;
+        });
+
+        enlistedLatch.await();
+
+        deactivateThroughClient();
+
+        log.info(">>> Cluster deactivated ...");
+
+        try {
+            txFinishedFut.get();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+
+            fail("Exception is not expected here");
+        }
+    }
+
+    /** */
+    private void executeTransaction(boolean commit, CountDownLatch enlistedLatch,
+        GridAbsPredicate beforeCommitCondition) throws Exception {
+        try (Connection conn = connect()) {
+            execute(conn, "BEGIN");
+
+            execute(conn, "INSERT INTO t1 VALUES (1, '1')");
+
+            log.info(">>> Started transaction and enlisted entries");
+
+            enlistedLatch.countDown();
+
+            GridTestUtils.waitForCondition(beforeCommitCondition, 5_000);
+
+            log.info(">>> Attempting to finish transaction");
+
+            execute(conn, commit ? "COMMIT" : "ROLLBACK");
+        }
+    }
+
+    /** */
+    private static Connection connect() throws Exception {
+        return DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1");
+    }
+
+    /** */
+    private static void execute(Connection conn, String sql) throws Exception {
+        try (Statement stmt = conn.createStatement()) {
+            stmt.executeUpdate(sql);
+        }
+    }
+
+    /** */
+    private void deactivateThroughClient() throws Exception {
+        GridClientConfiguration clientCfg = new GridClientConfiguration();
+
+        clientCfg.setServers(Collections.singletonList("127.0.0.1:11211"));
+
+        try (GridClient client = GridClientFactory.start(clientCfg)) {
+            GridClientClusterState state = client.state();
+
+            log.info(">>> Try to deactivate ...");
+
+            state.active(false);
+        }
+    }
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientMarshallerBenchmarkTest.java b/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientMarshallerBenchmarkTest.java
index 08c2cbe37521..3b9b494523f9 100644
--- a/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientMarshallerBenchmarkTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientMarshallerBenchmarkTest.java
@@ -31,12 +31,16 @@
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.marshaller.MarshallerUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest.GridCacheOperation.CAS;
 
 /**
  * Tests basic performance of marshallers.
  */
+@RunWith(JUnit4.class)
 public class ClientMarshallerBenchmarkTest extends GridCommonAbstractTest {
     /** Marshallers to test. */
     private GridClientMarshaller[] marshallers;
@@ -58,6 +62,7 @@ public ClientMarshallerBenchmarkTest() {
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testCacheRequestTime() throws Exception {
         GridClientCacheRequest req = new GridClientCacheRequest(CAS);
 
@@ -162,4 +167,4 @@ public void testCacheRequestTime() throws Exception {
 
         return (T)res;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientTcpSslLoadTest.java b/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientTcpSslLoadTest.java
index 669c1104dde7..bd8d57d9482f 100644
--- a/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientTcpSslLoadTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/loadtests/client/ClientTcpSslLoadTest.java
@@ -20,10 +20,14 @@
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.client.ClientTcpSslMultiThreadedSelfTest;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Makes a long run to ensure stability and absence of memory leaks.
  */
+@RunWith(JUnit4.class)
 public class ClientTcpSslLoadTest extends ClientTcpSslMultiThreadedSelfTest {
     /** Test duration. */
     private static final long TEST_RUN_TIME = 8 * 60 * 60 * 1000;
@@ -37,6 +41,7 @@
     /**
      * @throws Exception If failed.
      */
+    @Test
     public void testLongRun() throws Exception {
         long start = System.currentTimeMillis();
 
@@ -83,4 +88,4 @@ private void clearCaches() {
                 log.error("Cache clear failed.", e);
             }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudIpFinderSelfTest.java b/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudIpFinderSelfTest.java
index c754553ef66e..f76c9037929e 100644
--- a/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudIpFinderSelfTest.java
+++ b/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudIpFinderSelfTest.java
@@ -25,10 +25,15 @@
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinderAbstractSelfTest;
 import org.apache.ignite.testsuites.IgniteCloudTestSuite;
 import org.apache.ignite.testsuites.IgniteIgnore;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * TcpDiscoveryCloudIpFinder test.
  */
+@RunWith(JUnit4.class)
 public class TcpDiscoveryCloudIpFinderSelfTest extends
     TcpDiscoveryIpFinderAbstractSelfTest<TcpDiscoveryCloudIpFinder> {
     /**
@@ -40,18 +45,20 @@ public TcpDiscoveryCloudIpFinderSelfTest() throws Exception {
         // No-op.
     }
 
-    @Override protected void beforeTest() throws Exception {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() {
         // No-op.
     }
 
-    /* {@inheritDoc} */
-    @Override protected TcpDiscoveryCloudIpFinder ipFinder() throws Exception {
+    /** {@inheritDoc} */
+    @Override protected TcpDiscoveryCloudIpFinder ipFinder() {
         // No-op.
         return null;
     }
 
-    /* {@inheritDoc} */
-    @Override public void testIpFinder() throws Exception {
+    /** {@inheritDoc} */
+    @Test
+    @Override public void testIpFinder() {
         // No-op
     }
 
@@ -61,6 +68,7 @@ public TcpDiscoveryCloudIpFinderSelfTest() throws Exception {
      * @throws Exception If any error occurs.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-845")
+    @Test
     public void testAmazonWebServices() throws Exception {
         testCloudProvider("aws-ec2");
     }
@@ -71,6 +79,7 @@ public void testAmazonWebServices() throws Exception {
      * @throws Exception If any error occurs.
      */
     @IgniteIgnore("https://issues.apache.org/jira/browse/IGNITE-1585")
+    @Test
     public void testGoogleComputeEngine() throws Exception {
         testCloudProvider("google-compute-engine");
     }
@@ -80,9 +89,9 @@ public void testGoogleComputeEngine() throws Exception {
      *
      * @throws Exception If any error occurs.
      */
+    @Ignore("https://issues.apache.org/jira/browse/IGNITE-9444")
+    @Test
     public void testRackspace() throws Exception {
-        fail("https://issues.apache.org/jira/browse/IGNITE-9444");
-
         testCloudProvider("rackspace-cloudservers-us");
     }
 
@@ -123,4 +132,4 @@ private void testCloudProvider(String provider) throws Exception {
 
         assert addresses.size() == ipFinder.getRegisteredAddresses().size();
     }
-}
\ No newline at end of file
+}
diff --git a/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java b/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
index 632cddc6c7bb..5be6d3b45449 100644
--- a/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
+++ b/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
@@ -19,23 +19,26 @@
 
 import java.util.Collection;
 import java.util.LinkedList;
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinderSelfTest;
 import org.apache.ignite.testframework.IgniteTestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
 
 /**
  * Ignite Cloud integration test.
  */
-public class IgniteCloudTestSuite extends TestSuite {
+@RunWith(AllTests.class)
+public class IgniteCloudTestSuite {
     /**
      * @return Test suite.
-     * @throws Exception Thrown in case of the failure.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new IgniteTestSuite("Cloud Integration Test Suite");
 
         // Cloud Nodes IP finder.
-        suite.addTestSuite(TcpDiscoveryCloudIpFinderSelfTest.class);
+        suite.addTest(new JUnit4TestAdapter(TcpDiscoveryCloudIpFinderSelfTest.class));
 
         return suite;
     }
@@ -51,7 +54,7 @@ public static String getAccessKey(String provider) {
         String key = System.getenv("test." + provider + ".access.key");
 
         assert key != null : "Environment variable 'test." + provider + ".access.key' is not set";
-        
+
         return key;
     }
 
@@ -111,4 +114,4 @@ public static String getSecretKey(String provider) {
 
         return list;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java b/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
index bcb9ef432e9f..ca2dcdc2b98f 100644
--- a/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
+++ b/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
@@ -43,8 +43,7 @@
 import org.apache.ignite.internal.GridDirectMap;
 import org.apache.ignite.internal.GridDirectTransient;
 import org.apache.ignite.internal.IgniteCodeGeneratingFail;
-import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxEnlistRequest;
-import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxEnlistResponse;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -117,6 +116,7 @@
         TYPES.put(BitSet.class, MessageCollectionItemType.BIT_SET);
         TYPES.put(UUID.class, MessageCollectionItemType.UUID);
         TYPES.put(IgniteUuid.class, MessageCollectionItemType.IGNITE_UUID);
+        TYPES.put(AffinityTopologyVersion.class, MessageCollectionItemType.AFFINITY_TOPOLOGY_VERSION);
     }
 
     /**
@@ -170,9 +170,7 @@ public static void main(String[] args) throws Exception {
 
 //        gen.generateAll(true);
 
-        gen.generateAndWrite(GridNearTxEnlistResponse.class);
-
-//        gen.generateAndWrite(GridNearAtomicUpdateRequest.class);
+//        gen.generateAndWrite(GridCacheMessage.class);
 
 //        gen.generateAndWrite(GridMessageCollection.class);
 //        gen.generateAndWrite(DataStreamerEntry.class);
@@ -239,6 +237,8 @@ public static void main(String[] args) throws Exception {
 //        gen.generateAndWrite(GridH2DmlResponse.class);
 //        gen.generateAndWrite(GridNearTxEnlistRequest.class);
 //        gen.generateAndWrite(GridNearTxEnlistResponse.class);
+//        gen.generateAndWrite(GenerateEncryptionKeyRequest.class);
+//        gen.generateAndWrite(GenerateEncryptionKeyResponse.class);
     }
 
     /**
@@ -662,6 +662,8 @@ else if (type == UUID.class)
             returnFalseIfFailed(write, "writer.writeUuid", field, getExpr);
         else if (type == IgniteUuid.class)
             returnFalseIfFailed(write, "writer.writeIgniteUuid", field, getExpr);
+        else if (type == AffinityTopologyVersion.class)
+            returnFalseIfFailed(write, "writer.writeAffinityTopologyVersion", field, getExpr);
         else if (type.isEnum()) {
             String arg = getExpr + " != null ? (byte)" + getExpr + ".ordinal() : -1";
 
@@ -744,6 +746,8 @@ else if (type == UUID.class)
             returnFalseIfReadFailed(name, "reader.readUuid", setExpr, field);
         else if (type == IgniteUuid.class)
             returnFalseIfReadFailed(name, "reader.readIgniteUuid", setExpr, field);
+        else if (type == AffinityTopologyVersion.class)
+            returnFalseIfReadFailed(name, "reader.readAffinityTopologyVersion", setExpr, field);
         else if (type.isEnum()) {
             String loc = name + "Ord";
 
diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/PdsWithTtlCompatibilityTest.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/PdsWithTtlCompatibilityTest.java
index 946caddb5f20..ffb05bb2e210 100644
--- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/PdsWithTtlCompatibilityTest.java
+++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/PdsWithTtlCompatibilityTest.java
@@ -43,6 +43,9 @@
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test PendingTree upgrading to per-partition basis. Test fill cache with persistence enabled and with ExpirePolicy
@@ -51,6 +54,7 @@
  * Note: Test for ignite-2.3 version will always fails due to entry ttl update fails with assertion on checkpoint lock
  * check.
  */
+@RunWith(JUnit4.class)
 public class PdsWithTtlCompatibilityTest extends IgnitePersistenceCompatibilityAbstractTest {
     /** */
     static final String TEST_CACHE_NAME = PdsWithTtlCompatibilityTest.class.getSimpleName();
@@ -84,6 +88,7 @@
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testNodeStartByOldVersionPersistenceData_2_1() throws Exception {
         doTestStartupWithOldVersion("2.1.0");
     }
diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/FoldersReuseCompatibilityTest.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/FoldersReuseCompatibilityTest.java
index e04f39f99321..a667c1526737 100644
--- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/FoldersReuseCompatibilityTest.java
+++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/FoldersReuseCompatibilityTest.java
@@ -36,12 +36,16 @@
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 import static org.apache.ignite.internal.processors.cache.persistence.filename.PdsConsistentIdProcessor.parseSubFolderName;
 
 /**
  * Test for new and old style persistent storage folders generation and compatible startup of current ignite version
  */
+@RunWith(JUnit4.class)
 public class FoldersReuseCompatibilityTest extends IgnitePersistenceCompatibilityAbstractTest {
     /** Cache name for test. */
     private static final String CACHE_NAME = "dummy";
@@ -80,6 +84,7 @@ public void ignored_testFoldersReuseCompatibility_2_3() throws Exception {
      *
      * @throws Exception if failed.
      */
+    @Test
     public void testFoldersReuseCompatibility_2_2() throws Exception {
         runFoldersReuse("2.2.0");
     }
@@ -90,6 +95,7 @@ public void testFoldersReuseCompatibility_2_2() throws Exception {
      *
      * @throws Exception if failed.
      */
+    @Test
     public void testFoldersReuseCompatibility_2_1() throws Exception {
         runFoldersReuse("2.1.0");
     }
diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/MigratingToWalV2SerializerWithCompactionTest.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/MigratingToWalV2SerializerWithCompactionTest.java
index d4c58f8f4b3c..84d0cfa610e6 100644
--- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/MigratingToWalV2SerializerWithCompactionTest.java
+++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/MigratingToWalV2SerializerWithCompactionTest.java
@@ -34,10 +34,14 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Saves data using previous version of ignite and then load this data using actual version
  */
+@RunWith(JUnit4.class)
 public class MigratingToWalV2SerializerWithCompactionTest extends IgnitePersistenceCompatibilityAbstractTest {
     /** */
     private static final String TEST_CACHE_NAME = MigratingToWalV2SerializerWithCompactionTest.class.getSimpleName();
@@ -78,6 +82,7 @@
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testCompactingOldWalFiles() throws Exception {
         doTestStartupWithOldVersion("2.3.0");
     }
diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/PersistenceBasicCompatibilityTest.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/PersistenceBasicCompatibilityTest.java
index f27caa34a284..8088dda909bb 100644
--- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/PersistenceBasicCompatibilityTest.java
+++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/persistence/PersistenceBasicCompatibilityTest.java
@@ -38,10 +38,14 @@
 import org.apache.ignite.internal.processors.cache.GridCacheAbstractFullApiSelfTest;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Saves data using previous version of ignite and then load this data using actual version.
  */
+@RunWith(JUnit4.class)
 public class PersistenceBasicCompatibilityTest extends IgnitePersistenceCompatibilityAbstractTest {
     /** */
     protected static final String TEST_CACHE_NAME = PersistenceBasicCompatibilityTest.class.getSimpleName();
@@ -76,6 +80,7 @@
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testNodeStartByOldVersionPersistenceData_2_2() throws Exception {
         doTestStartupWithOldVersion("2.2.0");
     }
@@ -85,6 +90,7 @@ public void testNodeStartByOldVersionPersistenceData_2_2() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testNodeStartByOldVersionPersistenceData_2_1() throws Exception {
         doTestStartupWithOldVersion("2.1.0");
     }
@@ -94,10 +100,41 @@ public void testNodeStartByOldVersionPersistenceData_2_1() throws Exception {
      *
      * @throws Exception If failed.
      */
+    @Test
     public void testNodeStartByOldVersionPersistenceData_2_3() throws Exception {
         doTestStartupWithOldVersion("2.3.0");
     }
 
+    /**
+     * Tests opportunity to read data from previous Ignite DB version.
+     *
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testNodeStartByOldVersionPersistenceData_2_4() throws Exception {
+        doTestStartupWithOldVersion("2.4.0");
+    }
+
+    /**
+     * Tests opportunity to read data from previous Ignite DB version.
+     *
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testNodeStartByOldVersionPersistenceData_2_5() throws Exception {
+        doTestStartupWithOldVersion("2.5.0");
+    }
+
+    /**
+     * Tests opportunity to read data from previous Ignite DB version.
+     *
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testNodeStartByOldVersionPersistenceData_2_6() throws Exception {
+        doTestStartupWithOldVersion("2.6.0");
+    }
+
     /**
      * Tests opportunity to read data from previous Ignite DB version.
      *
diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java
index f6dd73606d16..12ef3d091c6b 100644
--- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java
+++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testsuites/IgniteCompatibilityBasicTestSuite.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.compatibility.testsuites;
 
+import junit.framework.JUnit4TestAdapter;
 import junit.framework.TestSuite;
 import org.apache.ignite.compatibility.PdsWithTtlCompatibilityTest;
 import org.apache.ignite.compatibility.persistence.FoldersReuseCompatibilityTest;
@@ -29,18 +30,17 @@
 public class IgniteCompatibilityBasicTestSuite {
     /**
      * @return Test suite.
-     * @throws Exception In case of an error.
      */
-    public static TestSuite suite() throws Exception {
+    public static TestSuite suite() {
         TestSuite suite = new TestSuite("Ignite Compatibility Basic Test Suite");
 
-        suite.addTestSuite(PersistenceBasicCompatibilityTest.class);
+        suite.addTest(new JUnit4TestAdapter(PersistenceBasicCompatibilityTest.class));
 
-        suite.addTestSuite(PdsWithTtlCompatibilityTest.class);
+        suite.addTest(new JUnit4TestAdapter(PdsWithTtlCompatibilityTest.class));
 
-        suite.addTestSuite(FoldersReuseCompatibilityTest.class);
+        suite.addTest(new JUnit4TestAdapter(FoldersReuseCompatibilityTest.class));
 
-        suite.addTestSuite(MigratingToWalV2SerializerWithCompactionTest.class);
+        suite.addTest(new JUnit4TestAdapter(MigratingToWalV2SerializerWithCompactionTest.class));
 
         return suite;
     }
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCache.java b/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
index 8479420910f1..395c8f89a869 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
@@ -441,9 +441,9 @@
     public void localEvict(Collection<? extends K> keys);
 
     /**
-     * Peeks at in-memory cached value using default optional peek mode.
+     * Peeks at a value in the local storage using an optional peek mode.
      * <p>
-     * This method will not load value from any persistent store or from a remote node.
+     * This method will not load a value from the configured {@link CacheStore} or from a remote node.
      * <h2 class="header">Transactions</h2>
      * This method does not participate in any transactions.
      *
@@ -1516,7 +1516,7 @@
     /**
      * Gets a collection of lost partition IDs.
      *
-     * @return Lost paritions.
+     * @return Lost partitions.
      */
     public Collection<Integer> lostPartitions();
 
@@ -1531,4 +1531,51 @@
      * Clear cluster statistics for this cache.
      */
     public void clearStatistics();
+
+    /**
+     * Efficiently preloads cache primary partition into page memory.
+     * <p>
+     * This is useful for fast iteration over cache partition data if persistence is enabled and the data is "cold".
+     * <p>
+     * Preload will reduce available amount of page memory for subsequent operations and may lead to earlier page
+     * replacement.
+     * <p>
+     * This method is irrelevant for in-memory caches. Calling this method on an in-memory cache will result in
+     * exception.
+     *
+     * @param partition Partition.
+     */
+    public void preloadPartition(int partition);
+
+    /**
+     * Efficiently preloads cache partition into page memory.
+     * <p>
+     * This is useful for fast iteration over cache partition data if persistence is enabled and the data is "cold".
+     * <p>
+     * Preload will reduce available amount of page memory for subsequent operations and may lead to earlier page
+     * replacement.
+     * <p>
+     * This method is irrelevant for in-memory caches. Calling this method on an in-memory cache will result in
+     * exception.
+     *
+     * @param partition Partition.
+     * @return A future representing pending completion of the partition preloading.
+     */
+    public IgniteFuture<Void> preloadPartitionAsync(int partition);
+
+    /**
+     * Efficiently preloads cache partition into page memory if it exists on the local node.
+     * <p>
+     * This is useful for fast iteration over cache partition data if persistence is enabled and the data is "cold".
+     * <p>
+     * Preload will reduce available amount of page memory for subsequent operations and may lead to earlier page
+     * replacement.
+     * <p>
+     * This method is irrelevant for in-memory caches. Calling this method on an in-memory cache will result in
+     * exception.
+     *
+     * @param partition Partition.
+     * @return {@code True} if partition was preloaded, {@code false} if it doesn't belong to local node.
+     */
+    public boolean localPreloadPartition(int partition);
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 5932de05a309..3a65f5d42f5b 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -31,7 +31,6 @@
 import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
 import org.apache.ignite.internal.processors.rest.GridRestCommand;
 import org.apache.ignite.internal.util.GridLogThrottle;
-import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.stream.StreamTransformer;
 import org.jetbrains.annotations.Nullable;
 
@@ -260,6 +259,13 @@
      */
     public static final String IGNITE_TX_DEADLOCK_DETECTION_TIMEOUT = "IGNITE_TX_DEADLOCK_DETECTION_TIMEOUT";
 
+    /**
+     * System property to enable pending transaction tracker.
+     * Affects impact of {@link IgniteSystemProperties#IGNITE_DISABLE_WAL_DURING_REBALANCING} property:
+     * if this property is set, WAL anyway won't be disabled during rebalancing triggered by baseline topology change.
+     */
+    public static final String IGNITE_PENDING_TX_TRACKER_ENABLED = "IGNITE_PENDING_TX_TRACKER_ENABLED";
+
     /**
      * System property to override multicast group taken from configuration.
      * Used for testing purposes.
@@ -900,6 +906,11 @@
      */
     public static final String IGNITE_THRESHOLD_WAL_ARCHIVE_SIZE_PERCENTAGE = "IGNITE_THRESHOLD_WAL_ARCHIVE_SIZE_PERCENTAGE";
 
+    /**
+     * Count of WAL compressor worker threads. Default value is 4.
+     */
+    public static final String IGNITE_WAL_COMPRESSOR_WORKER_THREAD_CNT = "IGNITE_WAL_COMPRESSOR_WORKER_THREAD_CNT";
+
     /**
      * Whenever read load balancing is enabled, that means 'get' requests will be distributed between primary and backup
      * nodes if it is possible and {@link CacheConfiguration#readFromBackup} is {@code true}.
@@ -988,6 +999,72 @@
      */
     public static final String IGNITE_ZOOKEEPER_DISCOVERY_MAX_RETRY_COUNT = "IGNITE_ZOOKEEPER_DISCOVERY_MAX_RETRY_COUNT";
 
+    /**
+     * Maximum number for cached MVCC transaction updates. This caching is used for continuous query with MVCC caches.
+     */
+    public static final String IGNITE_MVCC_TX_SIZE_CACHING_THRESHOLD = "IGNITE_MVCC_TX_SIZE_CACHING_THRESHOLD";
+
+    /**
+     * Try reuse memory on deactivation. Useful in case of huge page memory region size.
+     */
+    public static final String IGNITE_REUSE_MEMORY_ON_DEACTIVATE = "IGNITE_REUSE_MEMORY_ON_DEACTIVATE";
+
+    /**
+     * Timeout for waiting schema update if schema was not found for last accepted version.
+     */
+    public static final String IGNITE_WAIT_SCHEMA_UPDATE = "IGNITE_WAIT_SCHEMA_UPDATE";
+
+    /**
+     * System property to override {@link CacheConfiguration#rebalanceThrottle} configuration property for all caches.
+     * {@code 0} by default, which means that override is disabled.
+     */
+    public static final String IGNITE_REBALANCE_THROTTLE_OVERRIDE = "IGNITE_REBALANCE_THROTTLE_OVERRIDE";
+
+    /**
+     * Maximum inactivity period for system worker in milliseconds. When this value is exceeded, worker is considered
+     * blocked with consequent critical failure handler invocation.
+     */
+    public static final String IGNITE_SYSTEM_WORKER_BLOCKED_TIMEOUT = "IGNITE_SYSTEM_WORKER_BLOCKED_TIMEOUT";
+
+    /**
+     * Timeout for checkpoint read lock acquisition in milliseconds.
+     */
+    public static final String IGNITE_CHECKPOINT_READ_LOCK_TIMEOUT = "IGNITE_CHECKPOINT_READ_LOCK_TIMEOUT";
+
+    /**
+     * Enables start caches in parallel.
+     *
+     * Default is {@code true}.
+     */
+    public static final String IGNITE_ALLOW_START_CACHES_IN_PARALLEL = "IGNITE_ALLOW_START_CACHES_IN_PARALLEL";
+
+    /** For test purposes only. Force Mvcc mode. */
+    public static final String IGNITE_FORCE_MVCC_MODE_IN_TESTS = "IGNITE_FORCE_MVCC_MODE_IN_TESTS";
+
+    /**
+     * Allows to log additional information about all restored partitions after binary and logical recovery phases.
+     *
+     * Default is {@code true}.
+     */
+    public static final String IGNITE_RECOVERY_VERBOSE_LOGGING = "IGNITE_RECOVERY_VERBOSE_LOGGING";
+
+    /**
+     * Disables cache interceptor triggering in case of conflicts.
+     *
+     * Default is {@code false}.
+     */
+    public static final String IGNITE_DISABLE_TRIGGERING_CACHE_INTERCEPTOR_ON_CONFLICT = "IGNITE_DISABLE_TRIGGERING_CACHE_INTERCEPTOR_ON_CONFLICT";
+
+    /**
+     * When set to {@code true}, cache metrics are not included into the discovery metrics update message (in this
+     * case message contains only cluster metrics). By default cache metrics are included into the message and
+     * calculated each time the message is sent.
+     * <p>
+     * Cache metrics sending can also be turned off by disabling statistics per each cache, but in this case some cache
+     * metrics will be unavailable via JMX too.
+     */
+    public static final String IGNITE_DISCOVERY_DISABLE_CACHE_METRICS_UPDATE = "IGNITE_DISCOVERY_DISABLE_CACHE_METRICS_UPDATE";
+
     /**
      * Enforces singleton.
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheAtomicityMode.java b/modules/core/src/main/java/org/apache/ignite/cache/CacheAtomicityMode.java
index 43c561ca7f28..5b101bf36577 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/CacheAtomicityMode.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheAtomicityMode.java
@@ -38,6 +38,10 @@
      * <b>Note!</b> In this mode, transactional consistency is guaranteed for key-value API operations only.
      * To enable ACID capabilities for SQL transactions, use the {@code TRANSACTIONAL_SNAPSHOT} mode.
      * <p>
+     * <b>Note!</b> This atomicity mode is not compatible with the other modes within the same transaction.
+     * if a transaction is executed over multiple caches, all caches must have the same atomicity mode,
+     * either {@code TRANSACTIONAL_SNAPSHOT} or {@code TRANSACTIONAL}.
+     * <p>
      * See {@link Transaction} for more information about transactions.
      */
     TRANSACTIONAL,
@@ -109,9 +113,9 @@
      * by the coordinator. This snapshot ensures that the transaction works with a consistent database state
      * during its execution period.
      * <p>
-     * Note! This atomicity mode is not compatible with the other modes within the same transaction.
-     * If a transaction is executed over multiple caches, all caches must have the same mode,
-     * either {@code TRANSACTIONAL_SNAPSHOT} or {@code TRANSACTIONAL}
+     * <b>Note!</b> This atomicity mode is not compatible with the other modes within the same transaction.
+     * If a transaction is executed over multiple caches, all caches must have the same atomicity mode,
+     * either {@code TRANSACTIONAL_SNAPSHOT} or {@code TRANSACTIONAL}.
      * <p>
      * See {@link Transaction} for more information about transactions.
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/affinity/AffinityKeyMapped.java b/modules/core/src/main/java/org/apache/ignite/cache/affinity/AffinityKeyMapped.java
index 8b1933857180..e7e9eba1ccfd 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/affinity/AffinityKeyMapped.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/affinity/AffinityKeyMapped.java
@@ -91,8 +91,8 @@
  * is otherwise known as {@code Collocation Of Computations And Data}. In this case,
  * {@code @AffinityKeyMapped} annotation allows to specify a routing affinity key for a
  * {@link org.apache.ignite.compute.ComputeJob} or any other grid computation, such as {@link Runnable},
- * {@link Callable}, or {@link org.apache.ignite.lang.IgniteClosure}. It should be attached to a method or
- * field that provides affinity key for the computation. Only one annotation per class is allowed.
+ * {@link Callable}, or {@link org.apache.ignite.lang.IgniteClosure}. It should be attached to a field
+ * that provides affinity key for the computation. Only one annotation per class is allowed.
  * Whenever such annotation is detected, then {@link org.apache.ignite.spi.loadbalancing.LoadBalancingSpi}
  * will be bypassed, and computation will be routed to the grid node where the specified affinity key is cached.
  * <p>
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/ContinuousQuery.java b/modules/core/src/main/java/org/apache/ignite/cache/query/ContinuousQuery.java
index e4d6d0ad3683..0d1444b7eac5 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/query/ContinuousQuery.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/query/ContinuousQuery.java
@@ -213,7 +213,16 @@ public ContinuousQuery() {
         return (ContinuousQuery<K, V>)super.setPageSize(pageSize);
     }
 
-    /** {@inheritDoc} */
+    /**
+     * Sets whether this query should be executed on local node only.
+     *
+     * Note: backup event queues are not kept for local continuous queries. It may lead to loss of notifications in case
+     * of node failures. Use {@link ContinuousQuery#setRemoteFilterFactory(Factory)} to register cache event listeners
+     * on all cache nodes, if delivery guarantee is required.
+     *
+     * @param loc Local flag.
+     * @return {@code this} for chaining.
+     */
     @Override public ContinuousQuery<K, V> setLocal(boolean loc) {
         return (ContinuousQuery<K, V>)super.setLocal(loc);
     }
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index fb3789d4df22..05be893392b0 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -58,6 +58,8 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.plugin.CachePluginConfiguration;
+import org.apache.ignite.spi.encryption.EncryptionSpi;
+import org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -316,7 +318,7 @@
     private long rebalanceThrottle = DFLT_REBALANCE_THROTTLE;
 
     /** */
-    private CacheInterceptor<?, ?> interceptor;
+    private CacheInterceptor<K, V> interceptor;
 
     /** */
     private Class<?>[] sqlFuncCls;
@@ -373,6 +375,15 @@
     /** Events disabled. */
     private boolean evtsDisabled = DFLT_EVENTS_DISABLED;
 
+    /**
+     * Flag indicating whether data must be encrypted.
+     * If {@code true} data on the disk will be encrypted.
+     *
+     * @see EncryptionSpi
+     * @see KeystoreEncryptionSpi
+     */
+    private boolean encryptionEnabled;
+
     /** Empty constructor (all values are initialized to their defaults). */
     public CacheConfiguration() {
         /* No-op. */
@@ -412,6 +423,7 @@ public CacheConfiguration(CompleteConfiguration<K, V> cfg) {
         cpOnRead = cc.isCopyOnRead();
         dfltLockTimeout = cc.getDefaultLockTimeout();
         eagerTtl = cc.isEagerTtl();
+        encryptionEnabled = cc.isEncryptionEnabled();
         evictFilter = cc.getEvictionFilter();
         evictPlc = cc.getEvictionPolicy();
         evictPlcFactory = cc.getEvictionPolicyFactory();
@@ -1618,9 +1630,8 @@ public int getMaxQueryIteratorsCount() {
      *
      * @return Cache interceptor.
      */
-    @SuppressWarnings({"unchecked"})
     @Nullable public CacheInterceptor<K, V> getInterceptor() {
-        return (CacheInterceptor<K, V>)interceptor;
+        return interceptor;
     }
 
     /**
@@ -2268,6 +2279,27 @@ public Boolean isEventsDisabled() {
         return this;
     }
 
+    /**
+     * Gets flag indicating whether data must be encrypted.
+     *
+     * @return {@code True} if this cache persistent data is encrypted.
+     */
+    public boolean isEncryptionEnabled() {
+        return encryptionEnabled;
+    }
+
+    /**
+     * Sets encrypted flag.
+     *
+     * @param encryptionEnabled {@code True} if this cache persistent data should be encrypted.
+     * @return {@code this} for chaining.
+     */
+    public CacheConfiguration<K, V> setEncryptionEnabled(boolean encryptionEnabled) {
+        this.encryptionEnabled = encryptionEnabled;
+        
+        return this;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(CacheConfiguration.class, this);
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java
index 556e3cd44b3a..7bca0f96479e 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java
@@ -279,6 +279,9 @@
      */
     private int walCompactionLevel = DFLT_WAL_COMPACTION_LEVEL;
 
+    /** Timeout for checkpoint read lock acquisition. */
+    private Long checkpointReadLockTimeout;
+
     /**
      * Initial size of a data region reserved for system cache.
      *
@@ -983,6 +986,30 @@ public void setWalCompactionLevel(int walCompactionLevel) {
         this.walCompactionLevel = walCompactionLevel;
     }
 
+    /**
+     * Returns timeout for checkpoint read lock acquisition.
+     *
+     * @see #setCheckpointReadLockTimeout(long)
+     * @return Returns timeout for checkpoint read lock acquisition in milliseconds.
+     */
+    public Long getCheckpointReadLockTimeout() {
+        return checkpointReadLockTimeout;
+    }
+
+    /**
+     * Sets timeout for checkpoint read lock acquisition.
+     * <p>
+     * When any thread cannot acquire checkpoint read lock in this time, then critical failure handler is being called.
+     *
+     * @param checkpointReadLockTimeout Timeout for checkpoint read lock acquisition in milliseconds.
+     * @return {@code this} for chaining.
+     */
+    public DataStorageConfiguration setCheckpointReadLockTimeout(long checkpointReadLockTimeout) {
+        this.checkpointReadLockTimeout = checkpointReadLockTimeout;
+
+        return this;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DataStorageConfiguration.class, this);
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
index 6a0c7cb3a4e3..a04fc53f681a 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java
@@ -21,6 +21,7 @@
 import java.lang.management.ManagementFactory;
 import java.util.Map;
 import java.util.UUID;
+import java.util.zip.Deflater;
 import javax.cache.configuration.Factory;
 import javax.cache.event.CacheEntryListener;
 import javax.cache.expiry.ExpiryPolicy;
@@ -68,6 +69,7 @@
 import org.apache.ignite.spi.deployment.local.LocalDeploymentSpi;
 import org.apache.ignite.spi.discovery.DiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.encryption.EncryptionSpi;
 import org.apache.ignite.spi.eventstorage.EventStorageSpi;
 import org.apache.ignite.spi.eventstorage.NoopEventStorageSpi;
 import org.apache.ignite.spi.failover.FailoverSpi;
@@ -118,6 +120,9 @@
     /** Default maximum timeout to wait for network responses in milliseconds (value is {@code 5,000ms}). */
     public static final long DFLT_NETWORK_TIMEOUT = 5000;
 
+    /** Default compression level for network messages (value is Deflater.BEST_SPEED. */
+    public static final int DFLT_NETWORK_COMPRESSION = Deflater.BEST_SPEED;
+
     /** Default interval between message send retries. */
     public static final long DFLT_SEND_RETRY_DELAY = 1000;
 
@@ -214,11 +219,11 @@
     /** Default timeout after which long query warning will be printed. */
     public static final long DFLT_LONG_QRY_WARN_TIMEOUT = 3000;
 
-    /** Default size of MVCC vacuum thread pool. */
+    /** Default number of MVCC vacuum threads.. */
     public static final int DFLT_MVCC_VACUUM_THREAD_CNT = 2;
 
-    /** Default time interval between vacuum process runs (ms). */
-    public static final int DFLT_MVCC_VACUUM_FREQUENCY = 5000;
+    /** Default time interval between MVCC vacuum runs in milliseconds. */
+    public static final long DFLT_MVCC_VACUUM_FREQUENCY = 5000;
 
     /** Optional local Ignite instance name. */
     private String igniteInstanceName;
@@ -301,6 +306,9 @@
     /** Maximum network requests timeout. */
     private long netTimeout = DFLT_NETWORK_TIMEOUT;
 
+    /** Compression level for network binary messages. */
+    private int netCompressionLevel = DFLT_NETWORK_COMPRESSION;
+
     /** Interval between message send retries. */
     private long sndRetryDelay = DFLT_SEND_RETRY_DELAY;
 
@@ -367,6 +375,9 @@
     /** Address resolver. */
     private AddressResolver addrRslvr;
 
+    /** Encryption SPI. */
+    private EncryptionSpi encryptionSpi;
+
     /** Cache configurations. */
     private CacheConfiguration[] cacheCfg;
 
@@ -407,6 +418,9 @@
     /** Failure detection timeout. */
     private Long failureDetectionTimeout = DFLT_FAILURE_DETECTION_TIMEOUT;
 
+    /** Timeout for blocked system workers detection. */
+    private Long sysWorkerBlockedTimeout;
+
     /** Failure detection timeout for client nodes. */
     private Long clientFailureDetectionTimeout = DFLT_CLIENT_FAILURE_DETECTION_TIMEOUT;
 
@@ -496,8 +510,8 @@
     /** Size of MVCC vacuum thread pool. */
     private int mvccVacuumThreadCnt = DFLT_MVCC_VACUUM_THREAD_CNT;
 
-    /** Time interval between vacuum process runs (ms). */
-    private int mvccVacuumFreq = DFLT_MVCC_VACUUM_FREQUENCY;
+    /** Time interval between vacuum runs (ms). */
+    private long mvccVacuumFreq = DFLT_MVCC_VACUUM_FREQUENCY;
 
     /** User authentication enabled. */
     private boolean authEnabled;
@@ -537,6 +551,7 @@ public IgniteConfiguration(IgniteConfiguration cfg) {
         failSpi = cfg.getFailoverSpi();
         loadBalancingSpi = cfg.getLoadBalancingSpi();
         indexingSpi = cfg.getIndexingSpi();
+        encryptionSpi = cfg.getEncryptionSpi();
 
         commFailureRslvr = cfg.getCommunicationFailureResolver();
 
@@ -619,6 +634,7 @@ public IgniteConfiguration(IgniteConfiguration cfg) {
         svcCfgs = cfg.getServiceConfiguration();
         svcPoolSize = cfg.getServiceThreadPoolSize();
         sysPoolSize = cfg.getSystemThreadPoolSize();
+        sysWorkerBlockedTimeout = cfg.getSystemWorkerBlockedTimeout();
         timeSrvPortBase = cfg.getTimeServerPortBase();
         timeSrvPortRange = cfg.getTimeServerPortRange();
         txCfg = cfg.getTransactionConfiguration();
@@ -1469,6 +1485,29 @@ public IgniteConfiguration setNetworkTimeout(long netTimeout) {
         return this;
     }
 
+    /**
+     * Compression level of internal network messages.
+     * <p>
+     * If not provided, then default value
+     * Deflater.BEST_SPEED is used.
+     *
+     * @return Network messages default compression level.
+     */
+    public int getNetworkCompressionLevel() {
+        return netCompressionLevel;
+    }
+
+    /**
+     * Compression level for internal network messages.
+     * <p>
+     * If not provided, then default value
+     * Deflater.BEST_SPEED is used.
+     *
+     */
+    public void setNetworkCompressionLevel(int netCompressionLevel) {
+        this.netCompressionLevel = netCompressionLevel;
+    }
+
     /**
      * Interval in milliseconds between message send retries.
      * <p>
@@ -1976,6 +2015,31 @@ public IgniteConfiguration setFailureDetectionTimeout(long failureDetectionTimeo
         return this;
     }
 
+    /**
+     * Returns maximum inactivity period for system worker. When this value is exceeded, worker is considered blocked
+     * with consequent critical failure handler invocation.
+     *
+     * @see #setSystemWorkerBlockedTimeout(long)
+     * @return Maximum inactivity period for system worker in milliseconds.
+     */
+    public Long getSystemWorkerBlockedTimeout() {
+        return sysWorkerBlockedTimeout;
+    }
+
+    /**
+     * Sets maximum inactivity period for system worker. When this value is exceeded, worker is considered blocked
+     * with consequent critical failure handler invocation.
+     *
+     * @see #setFailureHandler(FailureHandler)
+     * @param sysWorkerBlockedTimeout Maximum inactivity period for system worker in milliseconds.
+     * @return {@code this} for chaining.
+     */
+    public IgniteConfiguration setSystemWorkerBlockedTimeout(long sysWorkerBlockedTimeout) {
+        this.sysWorkerBlockedTimeout = sysWorkerBlockedTimeout;
+
+        return this;
+    }
+
     /**
      * Should return fully configured load balancing SPI implementation. If not provided,
      * {@link RoundRobinLoadBalancingSpi} will be used.
@@ -2061,6 +2125,28 @@ public IndexingSpi getIndexingSpi() {
         return indexingSpi;
     }
 
+    /**
+     * Sets fully configured instances of {@link EncryptionSpi}.
+     *
+     * @param encryptionSpi Fully configured instance of {@link EncryptionSpi}.
+     * @see IgniteConfiguration#getEncryptionSpi()
+     * @return {@code this} for chaining.
+     */
+    public IgniteConfiguration setEncryptionSpi(EncryptionSpi encryptionSpi) {
+        this.encryptionSpi = encryptionSpi;
+
+        return this;
+    }
+
+    /**
+     * Gets fully configured encryption SPI implementations.
+     *
+     * @return Encryption SPI implementation.
+     */
+    public EncryptionSpi getEncryptionSpi() {
+        return encryptionSpi;
+    }
+
     /**
      * Gets address resolver for addresses mapping determination.
      *
@@ -2998,18 +3084,18 @@ public IgniteConfiguration setFailureHandler(FailureHandler failureHnd) {
     }
 
     /**
-     * Returns number of MVCC vacuum cleanup threads.
+     * Returns number of MVCC vacuum threads.
      *
-     * @return Number of MVCC vacuum cleanup threads.
+     * @return Number of MVCC vacuum threads.
      */
     public int getMvccVacuumThreadCount() {
         return mvccVacuumThreadCnt;
     }
 
     /**
-     * Sets number of MVCC vacuum cleanup threads.
+     * Sets number of MVCC vacuum threads.
      *
-     * @param mvccVacuumThreadCnt Number of MVCC vacuum cleanup threads.
+     * @param mvccVacuumThreadCnt Number of MVCC vacuum threads.
      * @return {@code this} for chaining.
      */
     public IgniteConfiguration setMvccVacuumThreadCount(int mvccVacuumThreadCnt) {
@@ -3019,21 +3105,21 @@ public IgniteConfiguration setMvccVacuumThreadCount(int mvccVacuumThreadCnt) {
     }
 
     /**
-     * Returns time interval between vacuum runs.
+     * Returns time interval between MVCC vacuum runs in milliseconds.
      *
-     * @return Time interval between vacuum runs.
+     * @return Time interval between MVCC vacuum runs in milliseconds.
      */
-    public int getMvccVacuumFrequency() {
+    public long getMvccVacuumFrequency() {
         return mvccVacuumFreq;
     }
 
     /**
-     * Sets time interval between vacuum runs.
+     * Sets time interval between MVCC vacuum runs in milliseconds.
      *
-     * @param mvccVacuumFreq Time interval between vacuum runs.
+     * @param mvccVacuumFreq Time interval between MVCC vacuum runs in milliseconds.
      * @return {@code this} for chaining.
      */
-    public IgniteConfiguration setMvccVacuumFrequency(int mvccVacuumFreq) {
+    public IgniteConfiguration setMvccVacuumFrequency(long mvccVacuumFreq) {
         this.mvccVacuumFreq = mvccVacuumFreq;
 
         return this;
diff --git a/modules/core/src/main/java/org/apache/ignite/events/EventType.java b/modules/core/src/main/java/org/apache/ignite/events/EventType.java
index 485e5671e642..97017d638dd0 100644
--- a/modules/core/src/main/java/org/apache/ignite/events/EventType.java
+++ b/modules/core/src/main/java/org/apache/ignite/events/EventType.java
@@ -244,6 +244,16 @@
      */
     public static final int EVT_TASK_REDUCED = 25;
 
+    /**
+     * Built-in event type: Visor or Web Console management task started.
+     * <p>
+     * NOTE: all types in range <b>from 1 to 1000 are reserved</b> for
+     * internal Ignite events and should not be used by user-defined events.
+     *
+     * @see TaskEvent
+     */
+    public static final int EVT_MANAGEMENT_TASK_STARTED = 26;
+
     /**
      * Built-in event type: non-task class deployed.
      * <p>
diff --git a/modules/core/src/main/java/org/apache/ignite/failure/AbstractFailureHandler.java b/modules/core/src/main/java/org/apache/ignite/failure/AbstractFailureHandler.java
index 6ca6520f2128..79b1f8f6ea59 100644
--- a/modules/core/src/main/java/org/apache/ignite/failure/AbstractFailureHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/failure/AbstractFailureHandler.java
@@ -18,22 +18,33 @@
 package org.apache.ignite.failure;
 
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.Set;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
+import static org.apache.ignite.failure.FailureType.SYSTEM_CRITICAL_OPERATION_TIMEOUT;
+import static org.apache.ignite.failure.FailureType.SYSTEM_WORKER_BLOCKED;
+
 /**
  * Abstract superclass for {@link FailureHandler} implementations.
- * Maintains a set of ignored failure types.
+ * Maintains a set of ignored failure types. Failure handler will not invalidate kernal context for this failures
+ * and will not handle it.
  */
 public abstract class AbstractFailureHandler implements FailureHandler {
     /** */
     @GridToStringInclude
-    private Set<FailureType> ignoredFailureTypes = Collections.emptySet();
+    private Set<FailureType> ignoredFailureTypes =
+            Collections.unmodifiableSet(EnumSet.of(SYSTEM_WORKER_BLOCKED, SYSTEM_CRITICAL_OPERATION_TIMEOUT));
 
-    /** {@inheritDoc} */
-    @Override public void setIgnoredFailureTypes(Set<FailureType> failureTypes) {
+    /**
+     * Sets failure types that must be ignored by failure handler.
+     *
+     * @param failureTypes Set of failure type that must be ignored.
+     * @see FailureType
+     */
+    public void setIgnoredFailureTypes(Set<FailureType> failureTypes) {
         ignoredFailureTypes = Collections.unmodifiableSet(failureTypes);
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/failure/FailureHandler.java b/modules/core/src/main/java/org/apache/ignite/failure/FailureHandler.java
index f325e65608a8..8717b1670717 100644
--- a/modules/core/src/main/java/org/apache/ignite/failure/FailureHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/failure/FailureHandler.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.failure;
 
-import java.util.Set;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.processors.failure.FailureProcessor;
@@ -37,9 +36,4 @@
      * @return Whether kernal context must be invalidated or not.
      */
     public boolean onFailure(Ignite ignite, FailureContext failureCtx);
-
-    /**
-     * Sets failure types to ignore.
-     */
-    public void setIgnoredFailureTypes(Set<FailureType> failureTypes);
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/failure/FailureType.java b/modules/core/src/main/java/org/apache/ignite/failure/FailureType.java
index fbd5529fc879..114e432e1ef7 100644
--- a/modules/core/src/main/java/org/apache/ignite/failure/FailureType.java
+++ b/modules/core/src/main/java/org/apache/ignite/failure/FailureType.java
@@ -31,5 +31,8 @@
     SYSTEM_WORKER_BLOCKED,
 
     /** Critical error - error which leads to the system's inoperability. */
-    CRITICAL_ERROR
+    CRITICAL_ERROR,
+
+    /** System-critical operation has been timed out. */
+    SYSTEM_CRITICAL_OPERATION_TIMEOUT
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
index 0cf3a6eb3477..607217ebde2d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
@@ -67,7 +67,10 @@
         AUTH_PROC,
 
         /** */
-        CACHE_CRD_PROC
+        CACHE_CRD_PROC,
+
+        /** Encryption manager. */
+        ENCRYPTION_MGR
     }
 
     /**
@@ -153,7 +156,7 @@
     @Nullable public IgniteNodeValidationResult validateNode(ClusterNode node);
 
     /** */
-    @Nullable public IgniteNodeValidationResult validateNode(ClusterNode node, DiscoveryDataBag.JoiningNodeDiscoveryData discoData);
+    @Nullable public IgniteNodeValidationResult validateNode(ClusterNode node, JoiningNodeDiscoveryData discoData);
 
     /**
      * Gets unique component type to distinguish components providing discovery data. Must return non-null value
@@ -180,4 +183,4 @@
      * @return Future to wait before completing reconnect future.
      */
     @Nullable public IgniteInternalFuture<?> onReconnected(boolean clusterRestarted) throws IgniteCheckedException;
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridJobCancelRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/GridJobCancelRequest.java
index aaa69eaff719..ac3a87336fc9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridJobCancelRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridJobCancelRequest.java
@@ -201,4 +201,4 @@ public boolean system() {
     @Override public String toString() {
         return S.toString(GridJobCancelRequest.class, this);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteRequest.java
index 4357d1da07dc..ebfeb0153ffd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteRequest.java
@@ -664,7 +664,7 @@ public AffinityTopologyVersion getTopVer() {
                 writer.incrementState();
 
             case 24:
-                if (!writer.writeMessage("topVer", topVer))
+                if (!writer.writeAffinityTopologyVersion("topVer", topVer))
                     return false;
 
                 writer.incrementState();
@@ -885,7 +885,7 @@ public AffinityTopologyVersion getTopVer() {
                 reader.incrementState();
 
             case 24:
-                topVer = reader.readMessage("topVer");
+                topVer = reader.readAffinityTopologyVersion("topVer");
 
                 if (!reader.isLastRead())
                     return false;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteResponse.java
index 312435e92275..f052edf07d44 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridJobExecuteResponse.java
@@ -282,7 +282,7 @@ public AffinityTopologyVersion getRetryTopologyVersion() {
                 writer.incrementState();
 
             case 6:
-                if (!writer.writeMessage("retry", retry))
+                if (!writer.writeAffinityTopologyVersion("retry", retry))
                     return false;
 
                 writer.incrementState();
@@ -355,7 +355,7 @@ public AffinityTopologyVersion getRetryTopologyVersion() {
                 reader.incrementState();
 
             case 6:
-                retry = reader.readMessage("retry");
+                retry = reader.readAffinityTopologyVersion("retry");
 
                 if (!reader.isLastRead())
                     return false;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsRequest.java
index 8a11cef33aa2..d743a355f8d8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsRequest.java
@@ -161,4 +161,4 @@ public Object topic() {
     @Override public String toString() {
         return S.toString(GridJobSiblingsRequest.class, this);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsResponse.java
index 3911446d2b86..dc59ab5f3057 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridJobSiblingsResponse.java
@@ -141,4 +141,4 @@ public void unmarshalSiblings(Marshaller marsh) throws IgniteCheckedException {
     @Override public String toString() {
         return S.toString(GridJobSiblingsResponse.class, this);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
index 4cb68da5f60c..a43312cc8ac6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
@@ -28,6 +28,7 @@
 import org.apache.ignite.internal.managers.communication.GridIoManager;
 import org.apache.ignite.internal.managers.deployment.GridDeploymentManager;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.managers.encryption.GridEncryptionManager;
 import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
 import org.apache.ignite.internal.managers.failover.GridFailoverManager;
 import org.apache.ignite.internal.managers.indexing.GridIndexingManager;
@@ -424,6 +425,13 @@
      */
     public GridIndexingManager indexing();
 
+    /**
+     * Gets encryption manager.
+     *
+     * @return Encryption manager.
+     */
+    public GridEncryptionManager encryption();
+
     /**
      * Gets workers registry.
      *
@@ -690,4 +698,9 @@
      * @return Default uncaught exception handler used by thread pools.
      */
     public Thread.UncaughtExceptionHandler uncaughtExceptionHandler();
+
+    /**
+     * @return {@code True} if node is in recovery mode (before join to topology).
+     */
+    public boolean recoveryMode();
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index a0e3f93a65c3..08090f2bff1f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -38,6 +38,7 @@
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.failure.FailureType;
+import org.apache.ignite.internal.managers.encryption.GridEncryptionManager;
 import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager;
 import org.apache.ignite.internal.managers.collision.GridCollisionManager;
 import org.apache.ignite.internal.managers.communication.GridIoManager;
@@ -162,6 +163,10 @@
     @GridToStringExclude
     private GridIndexingManager indexingMgr;
 
+    /** */
+    @GridToStringExclude
+    private GridEncryptionManager encryptionMgr;
+
     /*
      * Processors.
      * ==========
@@ -410,6 +415,9 @@
     /** Failure processor. */
     private FailureProcessor failureProc;
 
+    /** Recovery mode flag. Flag is set to {@code false} when discovery manager started. */
+    private boolean recoveryMode = true;
+
     /**
      * No-arg constructor is required by externalization.
      */
@@ -557,6 +565,8 @@ else if (comp instanceof GridLoadBalancerManager)
             loadMgr = (GridLoadBalancerManager)comp;
         else if (comp instanceof GridIndexingManager)
             indexingMgr = (GridIndexingManager)comp;
+        else if (comp instanceof GridEncryptionManager)
+            encryptionMgr = (GridEncryptionManager)comp;
 
         /*
          * Processors.
@@ -801,6 +811,11 @@ else if (helper instanceof HadoopHelper)
         return indexingMgr;
     }
 
+    /** {@inheritDoc} */
+    @Override public GridEncryptionManager encryption() {
+        return encryptionMgr;
+    }
+
     /** {@inheritDoc} */
     @Override public WorkersRegistry workersRegistry() {
         return workersRegistry;
@@ -1168,6 +1183,18 @@ void disconnected(boolean disconnected) {
         return hnd;
     }
 
+    /** {@inheritDoc} */
+    @Override public boolean recoveryMode() {
+        return recoveryMode;
+    }
+
+    /**
+     * @param recoveryMode Recovery mode.
+     */
+    public void recoveryMode(boolean recoveryMode) {
+        this.recoveryMode = recoveryMode;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridKernalContextImpl.class, this);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridTaskCancelRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/GridTaskCancelRequest.java
index 273d0a777a46..71c318b537dd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridTaskCancelRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridTaskCancelRequest.java
@@ -124,4 +124,4 @@ public IgniteUuid sessionId() {
     @Override public String toString() {
         return S.toString(GridTaskCancelRequest.class, this);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridTaskSessionRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/GridTaskSessionRequest.java
index dbac893189e3..576392e097fc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridTaskSessionRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridTaskSessionRequest.java
@@ -189,4 +189,4 @@ public IgniteUuid getJobId() {
     @Override public String toString() {
         return S.toString(GridTaskSessionRequest.class, this);
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java b/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
index 98a4d8d7be1c..95d7717ee2f3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
@@ -133,7 +133,10 @@
     TOPIC_EXCHANGE,
 
     /** */
-    TOPIC_CACHE_COORDINATOR;
+    TOPIC_CACHE_COORDINATOR,
+
+    /** */
+    TOPIC_GEN_ENC_KEY;
 
     /** Enum values. */
     private static final GridTopic[] VALS = values();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 6b1c9956717a..8c6629f31813 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -91,6 +91,7 @@
 import org.apache.ignite.configuration.BinaryConfiguration;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.CollectionConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
 import org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.MemoryConfiguration;
@@ -108,6 +109,7 @@
 import org.apache.ignite.internal.managers.deployment.GridDeploymentManager;
 import org.apache.ignite.internal.managers.discovery.DiscoveryLocalJoinData;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.managers.encryption.GridEncryptionManager;
 import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
 import org.apache.ignite.internal.managers.failover.GridFailoverManager;
 import org.apache.ignite.internal.managers.indexing.GridIndexingManager;
@@ -127,8 +129,8 @@
 import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccProcessorImpl;
 import org.apache.ignite.internal.processors.cache.persistence.DataRegion;
-import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager;
 import org.apache.ignite.internal.processors.cache.persistence.DataStorageMXBeanImpl;
+import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager;
 import org.apache.ignite.internal.processors.cache.persistence.filename.PdsConsistentIdProcessor;
 import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor;
 import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
@@ -186,9 +188,11 @@
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.worker.FailureHandlingMxBeanImpl;
 import org.apache.ignite.internal.worker.WorkersControlMXBeanImpl;
 import org.apache.ignite.internal.worker.WorkersRegistry;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteProductVersion;
@@ -200,6 +204,7 @@
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.mxbean.ClusterMetricsMXBean;
 import org.apache.ignite.mxbean.DataStorageMXBean;
+import org.apache.ignite.mxbean.FailureHandlingMxBean;
 import org.apache.ignite.mxbean.IgniteMXBean;
 import org.apache.ignite.mxbean.StripedExecutorMXBean;
 import org.apache.ignite.mxbean.ThreadPoolMXBean;
@@ -269,6 +274,7 @@
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SPI_CLASS;
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_TX_CONFIG;
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_USER_NAME;
+import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_VALIDATE_CACHE_REQUESTS;
 import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.BUILD_TSTAMP_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
@@ -987,6 +993,7 @@ public void start(
             startManager(new GridFailoverManager(ctx));
             startManager(new GridCollisionManager(ctx));
             startManager(new GridIndexingManager(ctx));
+            startManager(new GridEncryptionManager(ctx));
 
             ackSecurity();
 
@@ -1040,6 +1047,10 @@ public void start(
                 fillNodeAttributes(clusterProc.updateNotifierEnabled());
 
                 ctx.cache().context().database().notifyMetaStorageSubscribersOnReadyForRead();
+
+                ctx.cache().context().database().startMemoryRestore(ctx);
+
+                ctx.recoveryMode(false);
             }
             catch (Throwable e) {
                 U.error(
@@ -1079,6 +1090,14 @@ public void start(
 
             IgniteInternalFuture<Boolean> transitionWaitFut = joinData.transitionWaitFuture();
 
+            // Notify discovery manager the first to make sure that topology is discovered.
+            // Active flag is not used in managers, so it is safe to pass true.
+            ctx.discovery().onKernalStart(true);
+
+            // Notify IO manager the second so further components can send and receive messages.
+            // Must notify the IO manager before transition state await to make sure IO connection can be established.
+            ctx.io().onKernalStart(true);
+
             boolean active;
 
             if (transitionWaitFut != null) {
@@ -1092,12 +1111,6 @@ public void start(
             else
                 active = joinData.active();
 
-            // Notify discovery manager the first to make sure that topology is discovered.
-            ctx.discovery().onKernalStart(active);
-
-            // Notify IO manager the second so further components can send and receive messages.
-            ctx.io().onKernalStart(active);
-
             boolean recon = false;
 
             // Callbacks.
@@ -1352,7 +1365,9 @@ private HadoopProcessorAdapter createHadoopComponent() throws IgniteCheckedExcep
     private void validateCommon(IgniteConfiguration cfg) {
         A.notNull(cfg.getNodeId(), "cfg.getNodeId()");
 
-        A.notNull(cfg.getMBeanServer(), "cfg.getMBeanServer()");
+        if (!U.IGNITE_MBEANS_DISABLED)
+            A.notNull(cfg.getMBeanServer(), "cfg.getMBeanServer()");
+
         A.notNull(cfg.getGridLogger(), "cfg.getGridLogger()");
         A.notNull(cfg.getMarshaller(), "cfg.getMarshaller()");
         A.notNull(cfg.getUserAttributes(), "cfg.getUserAttributes()");
@@ -1553,6 +1568,8 @@ private void fillNodeAttributes(boolean notifyEnabled) throws IgniteCheckedExcep
 
         add(ATTR_CONSISTENCY_CHECK_SKIPPED, getBoolean(IGNITE_SKIP_CONFIGURATION_CONSISTENCY_CHECK));
 
+        add(ATTR_VALIDATE_CACHE_REQUESTS, Boolean.TRUE);
+
         if (cfg.getConsistentId() != null)
             add(ATTR_NODE_CONSISTENT_ID, cfg.getConsistentId());
 
@@ -1864,13 +1881,24 @@ private void ackStart(RuntimeMXBean rtBean) {
         ClusterNode locNode = localNode();
 
         if (log.isQuiet()) {
+            ackDataRegions(s -> {
+                U.quiet(false, s);
+
+                return null;
+            });
+
             U.quiet(false, "");
+
             U.quiet(false, "Ignite node started OK (id=" + U.id8(locNode.id()) +
                 (F.isEmpty(igniteInstanceName) ? "" : ", instance name=" + igniteInstanceName) + ')');
         }
 
         if (log.isInfoEnabled()) {
-            log.info("");
+            ackDataRegions(s -> {
+                log.info(s);
+
+                return null;
+            });
 
             String ack = "Ignite ver. " + VER_STR + '#' + BUILD_TSTAMP_STR + "-sha1:" + REV_HASH_STR;
 
@@ -1907,6 +1935,48 @@ private void ackStart(RuntimeMXBean rtBean) {
         }
     }
 
+    /**
+     * @param clo Message output closure.
+     */
+    public void ackDataRegions(IgniteClosure<String, Void> clo) {
+        DataStorageConfiguration memCfg = ctx.config().getDataStorageConfiguration();
+
+        if (memCfg == null)
+            return;
+
+        clo.apply("Data Regions Configured:");
+        clo.apply(dataRegionConfigurationMessage(memCfg.getDefaultDataRegionConfiguration()));
+
+        DataRegionConfiguration[] dataRegions = memCfg.getDataRegionConfigurations();
+
+        if (dataRegions != null) {
+            for (DataRegionConfiguration dataRegion : dataRegions) {
+                String msg = dataRegionConfigurationMessage(dataRegion);
+
+                if (msg != null)
+                    clo.apply(msg);
+            }
+        }
+    }
+
+    /**
+     * @param regCfg Data region configuration.
+     * @return Data region message.
+     */
+    private String dataRegionConfigurationMessage(DataRegionConfiguration regCfg) {
+        if (regCfg == null)
+            return null;
+
+        SB m = new SB();
+
+        m.a("  ^-- ").a(regCfg.getName()).a(" [");
+        m.a("initSize=").a(U.readableSize(regCfg.getInitialSize(), false));
+        m.a(", maxSize=").a(U.readableSize(regCfg.getMaxSize(), false));
+        m.a(", persistence=" + regCfg.isPersistenceEnabled()).a(']');
+
+        return m.toString();
+    }
+
     /**
      * Logs out OS information.
      */
@@ -2228,6 +2298,9 @@ else if (state == STARTING)
                 }
             }
 
+            if (ctx.hadoopHelper() != null)
+                ctx.hadoopHelper().close();
+
             if (starveTask != null)
                 starveTask.close();
 
@@ -2316,6 +2389,7 @@ else if (state == STARTING)
             MarshallerExclusions.clearCache();
             BinaryEnumCache.clear();
 
+
             gw.writeLock();
 
             try {
@@ -2516,19 +2590,25 @@ private void ackSpis() {
      *
      */
     private void ackRebalanceConfiguration() throws IgniteCheckedException {
-        if (cfg.getSystemThreadPoolSize() <= cfg.getRebalanceThreadPoolSize())
-            throw new IgniteCheckedException("Rebalance thread pool size exceed or equals System thread pool size. " +
-                "Change IgniteConfiguration.rebalanceThreadPoolSize property before next start.");
-
-        if (cfg.getRebalanceThreadPoolSize() < 1)
-            throw new IgniteCheckedException("Rebalance thread pool size minimal allowed value is 1. " +
-                "Change IgniteConfiguration.rebalanceThreadPoolSize property before next start.");
-
-        for (CacheConfiguration ccfg : cfg.getCacheConfiguration()) {
-            if (ccfg.getRebalanceBatchesPrefetchCount() < 1)
-                throw new IgniteCheckedException("Rebalance batches prefetch count minimal allowed value is 1. " +
-                    "Change CacheConfiguration.rebalanceBatchesPrefetchCount property before next start. " +
-                    "[cache=" + ccfg.getName() + "]");
+        if (cfg.isClientMode()) {
+            if (cfg.getRebalanceThreadPoolSize() != IgniteConfiguration.DFLT_REBALANCE_THREAD_POOL_SIZE)
+                U.warn(log, "Setting the rebalance pool size has no effect on the client mode");
+        }
+        else {
+            if (cfg.getSystemThreadPoolSize() <= cfg.getRebalanceThreadPoolSize())
+                throw new IgniteCheckedException("Rebalance thread pool size exceed or equals System thread pool size. " +
+                    "Change IgniteConfiguration.rebalanceThreadPoolSize property before next start.");
+
+            if (cfg.getRebalanceThreadPoolSize() < 1)
+                throw new IgniteCheckedException("Rebalance thread pool size minimal allowed value is 1. " +
+                    "Change IgniteConfiguration.rebalanceThreadPoolSize property before next start.");
+
+            for (CacheConfiguration ccfg : cfg.getCacheConfiguration()) {
+                if (ccfg.getRebalanceBatchesPrefetchCount() < 1)
+                    throw new IgniteCheckedException("Rebalance batches prefetch count minimal allowed value is 1. " +
+                        "Change CacheConfiguration.rebalanceBatchesPrefetchCount property before next start. " +
+                        "[cache=" + ccfg.getName() + "]");
+            }
         }
     }
 
@@ -4306,6 +4386,12 @@ private void registerAllMBeans(
                 registerMBean("Kernal", workerCtrlMXBean.getClass().getSimpleName(),
                     workerCtrlMXBean, WorkersControlMXBean.class);
             }
+
+            FailureHandlingMxBean blockOpCtrlMXBean = new FailureHandlingMxBeanImpl(workersRegistry,
+                ctx.cache().context().database());
+
+            registerMBean("Kernal", blockOpCtrlMXBean.getClass().getSimpleName(), blockOpCtrlMXBean,
+                FailureHandlingMxBean.class);
         }
 
         /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java
index 5b764e40bd55..3945adf33d38 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java
@@ -196,12 +196,18 @@
     /** User authentication enabled flag. */
     public static final String ATTR_AUTHENTICATION_ENABLED = ATTR_PREFIX + ".authentication.enabled";
 
+    /** Encryption master key digest. */
+    public static final String ATTR_ENCRYPTION_MASTER_KEY_DIGEST = ATTR_PREFIX + ".master.key.digest";
+
     /** Rebalance thread pool size. */
     public static final String ATTR_REBALANCE_POOL_SIZE = ATTR_PREFIX + ".rebalance.pool.size";
 
     /** Internal attribute name constant. */
     public static final String ATTR_DYNAMIC_CACHE_START_ROLLBACK_SUPPORTED = ATTR_PREFIX + ".dynamic.cache.start.rollback.supported";
 
+    /** Internal attribute indicates that incoming cache requests should be validated on primary node as well. */
+    public static final String ATTR_VALIDATE_CACHE_REQUESTS = ATTR_CACHE + ".validate.cache.requests";
+
     /**
      * Enforces singleton.
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
index ed0fbe9b5671..d3dde71d22d5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
@@ -115,6 +115,7 @@
 import org.apache.ignite.spi.deployment.local.LocalDeploymentSpi;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder;
+import org.apache.ignite.spi.encryption.noop.NoopEncryptionSpi;
 import org.apache.ignite.spi.eventstorage.NoopEventStorageSpi;
 import org.apache.ignite.spi.failover.always.AlwaysFailoverSpi;
 import org.apache.ignite.spi.indexing.noop.NoopIndexingSpi;
@@ -137,6 +138,7 @@
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_NO_SHUTDOWN_HOOK;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_RESTART_CODE;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_SUCCESS_FILE;
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_SYSTEM_WORKER_BLOCKED_TIMEOUT;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
 import static org.apache.ignite.cache.CacheMode.REPLICATED;
 import static org.apache.ignite.cache.CacheRebalanceMode.SYNC;
@@ -1155,9 +1157,11 @@ private static Ignite startConfigurations(
             try {
                 grid.start(startCtx);
             }
-            catch (IgniteInterruptedCheckedException e) {
-                if (grid.starterThreadInterrupted)
-                    Thread.interrupted();
+            catch (Exception e) {
+                if (X.hasCause(e, IgniteInterruptedCheckedException.class, InterruptedException.class)) {
+                    if (grid.starterThreadInterrupted)
+                        Thread.interrupted();
+                }
 
                 throw e;
             }
@@ -1829,7 +1833,10 @@ private void start0(GridStartContext startCtx) throws IgniteCheckedException {
                                 new IgniteException(S.toString(GridWorker.class, deadWorker))));
                     }
                 },
-                cfg.getFailureDetectionTimeout(),
+                IgniteSystemProperties.getLong(IGNITE_SYSTEM_WORKER_BLOCKED_TIMEOUT,
+                    cfg.getSystemWorkerBlockedTimeout() != null
+                    ? cfg.getSystemWorkerBlockedTimeout()
+                    : cfg.getFailureDetectionTimeout()),
                 log);
 
             stripedExecSvc = new StripedExecutor(
@@ -2444,6 +2451,9 @@ private void initializeDefaultSpi(IgniteConfiguration cfg) {
 
             if (cfg.getIndexingSpi() == null)
                 cfg.setIndexingSpi(new NoopIndexingSpi());
+
+            if (cfg.getEncryptionSpi() == null)
+                cfg.setEncryptionSpi(new NoopEncryptionSpi());
         }
 
         /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 9bad1eacb772..7d5bbda4100a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -576,10 +576,10 @@ public void onMarshallerProcessorStop() {
     }
 
     /**
-     * @return custom marshaller mapping files directory. Used for standalone WAL iteration
+     * @return {@code True} if marshaller context is initialized.
      */
-    @Nullable public File getMarshallerMappingFileStoreDir() {
-        return marshallerMappingFileStoreDir;
+    public boolean initialized() {
+        return fileStore != null;
     }
 
     /**
@@ -656,4 +656,4 @@ public void setMarshallerMappingFileStoreDir(@Nullable final File marshallerMapp
             return userMap.containsKey(key) || sysMap.containsKey(key);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
index 16738de12343..a8a3c886617b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
@@ -72,12 +72,8 @@ else if ("servers".equals(prj))
 
             VisorTxSortOrder sortOrder = null;
 
-            if (order != null) {
-                if ("DURATION".equals(order))
-                    sortOrder = VisorTxSortOrder.DURATION;
-                else if ("SIZE".equals(order))
-                    sortOrder = VisorTxSortOrder.SIZE;
-            }
+            if (order != null)
+                sortOrder = VisorTxSortOrder.valueOf(order.toUpperCase());
 
             VisorTxTaskArg arg = new VisorTxTaskArg(kill ? VisorTxOperation.KILL : VisorTxOperation.LIST,
                 limit, minDuration == null ? null : minDuration * 1000, minSize, null, proj, consIds, xid, lbRegex, sortOrder);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
index 87c4f3e18d8f..7d138a30e6d8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
@@ -26,6 +26,7 @@
 import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.binary.BinaryObjectException;
+import org.apache.ignite.internal.UnregisteredBinaryTypeException;
 import org.apache.ignite.internal.UnregisteredClassException;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.F;
@@ -156,7 +157,7 @@ public void write(Object obj, BinaryWriterExImpl writer) throws BinaryObjectExce
             write0(obj, writer);
         }
         catch (Exception ex) {
-            if (ex instanceof UnregisteredClassException)
+            if (ex instanceof UnregisteredClassException || ex instanceof UnregisteredBinaryTypeException)
                 throw ex;
 
             if (S.INCLUDE_SENSITIVE && !F.isEmpty(name))
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
index 920a29685621..f213ad916cc5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
@@ -32,6 +32,7 @@
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.thread.IgniteThread;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -201,12 +202,17 @@ private String toString(BinaryReaderHandles ctx, IdentityHashMap<BinaryObject, I
 
         BinaryType meta;
 
+        IgniteThread.onForbidBinaryMetadataRequestSectionEntered();
+
         try {
             meta = rawType();
         }
         catch (BinaryObjectException ignore) {
             meta = null;
         }
+        finally {
+            IgniteThread.onForbidBinaryMetadataRequestSectionLeft();
+        }
 
         if (meta == null || !S.INCLUDE_SENSITIVE)
             return S.toString(S.INCLUDE_SENSITIVE ? BinaryObject.class.getSimpleName() : "BinaryObject",
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
index 38934f07d6ae..601141c30641 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
@@ -2028,7 +2028,6 @@ public BinarySchema getOrCreateSchema() {
                     for (BinarySchema existingSchema : existingSchemas)
                         existingSchemaIds.add(existingSchema.schemaId());
 
-
                     throw new BinaryObjectException("Cannot find schema for object with compact footer" +
                         " [typeName=" + type.typeName() +
                         ", typeId=" + typeId +
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
index 91f29b22cfd8..f22fc4c05212 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.binary;
 
+import java.util.ArrayList;
+import java.util.List;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.HashMap;
@@ -98,75 +100,95 @@ else if (schemaId == schemaId4)
      * @param schemaId Schema ID.
      * @param schema Schema.
      */
-    public void addSchema(int schemaId, BinarySchema schema) {
-        synchronized (this) {
-            if (inline) {
-                // Check if this is already known schema.
-                if (schemaId == schemaId1 || schemaId == schemaId2 || schemaId == schemaId3 || schemaId == schemaId4)
-                    return;
+    public synchronized void addSchema(int schemaId, BinarySchema schema) {
+        if (inline) {
+            // Check if this is already known schema.
+            if (schemaId == schemaId1 || schemaId == schemaId2 || schemaId == schemaId3 || schemaId == schemaId4)
+                return;
 
-                // Try positioning new schema in inline mode.
-                if (schemaId1 == EMPTY) {
-                    schemaId1 = schemaId;
+            // Try positioning new schema in inline mode.
+            if (schemaId1 == EMPTY) {
+                schemaId1 = schemaId;
 
-                    schema1 = schema;
+                schema1 = schema;
 
-                    inline = true; // Forcing HB edge just in case.
+                inline = true; // Forcing HB edge just in case.
 
-                    return;
-                }
+                return;
+            }
 
-                if (schemaId2 == EMPTY) {
-                    schemaId2 = schemaId;
+            if (schemaId2 == EMPTY) {
+                schemaId2 = schemaId;
 
-                    schema2 = schema;
+                schema2 = schema;
 
-                    inline = true; // Forcing HB edge just in case.
+                inline = true; // Forcing HB edge just in case.
 
-                    return;
-                }
+                return;
+            }
 
-                if (schemaId3 == EMPTY) {
-                    schemaId3 = schemaId;
+            if (schemaId3 == EMPTY) {
+                schemaId3 = schemaId;
 
-                    schema3 = schema;
+                schema3 = schema;
 
-                    inline = true; // Forcing HB edge just in case.
+                inline = true; // Forcing HB edge just in case.
 
-                    return;
-                }
+                return;
+            }
 
-                if (schemaId4 == EMPTY) {
-                    schemaId4 = schemaId;
+            if (schemaId4 == EMPTY) {
+                schemaId4 = schemaId;
 
-                    schema4 = schema;
+                schema4 = schema;
 
-                    inline = true; // Forcing HB edge just in case.
+                inline = true; // Forcing HB edge just in case.
 
-                    return;
-                }
+                return;
+            }
 
-                // No luck, switching to hash map mode.
-                HashMap<Integer, BinarySchema> newSchemas = new HashMap<>();
+            // No luck, switching to hash map mode.
+            HashMap<Integer, BinarySchema> newSchemas = new HashMap<>();
 
-                newSchemas.put(schemaId1, schema1);
-                newSchemas.put(schemaId2, schema2);
-                newSchemas.put(schemaId3, schema3);
-                newSchemas.put(schemaId4, schema4);
+            newSchemas.put(schemaId1, schema1);
+            newSchemas.put(schemaId2, schema2);
+            newSchemas.put(schemaId3, schema3);
+            newSchemas.put(schemaId4, schema4);
 
-                newSchemas.put(schemaId, schema);
+            newSchemas.put(schemaId, schema);
 
-                schemas = newSchemas;
+            schemas = newSchemas;
 
-                inline = false;
-            }
-            else {
-                HashMap<Integer, BinarySchema> newSchemas = new HashMap<>(schemas);
+            inline = false;
+        }
+        else {
+            HashMap<Integer, BinarySchema> newSchemas = new HashMap<>(schemas);
 
-                newSchemas.put(schemaId, schema);
+            newSchemas.put(schemaId, schema);
 
-                schemas = newSchemas;
-            }
+            schemas = newSchemas;
         }
     }
+
+    /**
+     * @return List of known schemas.
+     */
+    public synchronized List<BinarySchema> schemas() {
+        List<BinarySchema> res = new ArrayList<>();
+
+        if (inline) {
+            if (schemaId1 != EMPTY)
+                res.add(schema1);
+            if (schemaId2 != EMPTY)
+                res.add(schema2);
+            if (schemaId3 != EMPTY)
+                res.add(schema3);
+            if (schemaId4 != EMPTY)
+                res.add(schema4);
+        }
+        else
+            res.addAll(schemas.values());
+
+        return res;
+    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index 553d8e5b79bd..77dce5602ec4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -958,10 +958,30 @@ else if (fieldOffsetSize == OFFSET_2)
      * @throws BinaryObjectException If merge failed due to metadata conflict.
      */
     public static BinaryMetadata mergeMetadata(@Nullable BinaryMetadata oldMeta, BinaryMetadata newMeta) {
+        return mergeMetadata(oldMeta, newMeta, null);
+    }
+
+    /**
+     * Merge old and new metas.
+     *
+     * @param oldMeta Old meta.
+     * @param newMeta New meta.
+     * @param changedSchemas Set for holding changed schemas.
+     * @return New meta if old meta was null, old meta if no changes detected, merged meta otherwise.
+     * @throws BinaryObjectException If merge failed due to metadata conflict.
+     */
+    public static BinaryMetadata mergeMetadata(@Nullable BinaryMetadata oldMeta, BinaryMetadata newMeta,
+        @Nullable Set<Integer> changedSchemas) {
         assert newMeta != null;
 
-        if (oldMeta == null)
+        if (oldMeta == null) {
+            if (changedSchemas != null) {
+                for (BinarySchema schema : newMeta.schemas())
+                    changedSchemas.add(schema.schemaId());
+            }
+
             return newMeta;
+        }
         else {
             assert oldMeta.typeId() == newMeta.typeId();
 
@@ -1036,8 +1056,12 @@ public static BinaryMetadata mergeMetadata(@Nullable BinaryMetadata oldMeta, Bin
             Collection<BinarySchema> mergedSchemas = new HashSet<>(oldMeta.schemas());
 
             for (BinarySchema newSchema : newMeta.schemas()) {
-                if (mergedSchemas.add(newSchema))
+                if (mergedSchemas.add(newSchema)) {
                     changed = true;
+
+                    if (changedSchemas != null)
+                        changedSchemas.add(newSchema.schemaId());
+                }
             }
 
             // Return either old meta if no changes detected, or new merged meta.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
index abd63cd7b53c..a824f4b73614 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
@@ -178,8 +178,7 @@ public BinaryObjectBuilderImpl(BinaryObjectImpl obj) {
             Thread curThread = Thread.currentThread();
 
             if (curThread instanceof IgniteThread)
-                writer.failIfUnregistered(((IgniteThread)curThread).executingEntryProcessor() &&
-                    ((IgniteThread)curThread).holdsTopLock());
+                writer.failIfUnregistered(((IgniteThread)curThread).isForbiddenToRequestBinaryMetadata());
 
             writer.typeId(typeId);
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/ssl/GridSslBasicContextFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/client/ssl/GridSslBasicContextFactory.java
index 8bf1e8d58e09..27a32df246a5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/client/ssl/GridSslBasicContextFactory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/client/ssl/GridSslBasicContextFactory.java
@@ -23,17 +23,20 @@
 import java.io.InputStream;
 import java.security.GeneralSecurityException;
 import java.security.KeyStore;
-import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.util.Arrays;
+import java.util.Collection;
 import javax.cache.configuration.Factory;
 import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLParameters;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.TrustManagerFactory;
 import javax.net.ssl.X509TrustManager;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ssl.SSLContextWrapper;
 
 /**
  * Basic ssl context factory that provides ssl context configuration with specified key
@@ -87,6 +90,12 @@
     /** Trust managers. */
     private TrustManager[] trustMgrs;
 
+    /** Enabled cipher suites. */
+    private String[] cipherSuites;
+
+    /** Enabled protocols. */
+    private String[] protocols;
+
     /**
      * Gets key store type used for context creation.
      *
@@ -269,6 +278,63 @@ public void setTrustManagers(TrustManager... trustMgrs) {
         this.trustMgrs = trustMgrs;
     }
 
+    /**
+     * Gets enabled cipher suites.
+     *
+     * @return Enabled cipher suites.
+     */
+    public String[] getCipherSuites() {
+        return cipherSuites;
+    }
+
+    /**
+     * Sets enabled cipher suites.
+     *
+     * @param cipherSuites Enabled cipher suites.
+     */
+    public void setCipherSuites(String... cipherSuites) {
+        this.cipherSuites = cipherSuites;
+    }
+
+
+    /**
+     * Sets enabled cipher suites.
+     *
+     * @param cipherSuites Enabled cipher suites.
+     */
+    public void setCipherSuites(Collection<String> cipherSuites) {
+        if (!F.isEmpty(cipherSuites))
+            setCipherSuites(cipherSuites.toArray(new String[0]));
+    }
+
+    /**
+     * Gets enabled protocols.
+     *
+     * @return Enabled protocols.
+     */
+    public String[] getProtocols() {
+        return protocols;
+    }
+
+    /**
+     * Sets enabled protocols.
+     *
+     * @param protocols Enabled protocols.
+     */
+    public void setProtocols(String... protocols) {
+        this.protocols = protocols;
+    }
+
+    /**
+     * Sets enabled protocols.
+     *
+     * @param protocols Enabled protocols.
+     */
+    public void setProtocols(Collection<String> protocols) {
+        if (!F.isEmpty(protocols))
+            setProtocols(protocols.toArray(new String[0]));
+    }
+
     /**
      * Returns an instance of trust manager that will always succeed regardless of certificate provided.
      *
@@ -303,6 +369,18 @@ public static TrustManager getDisabledTrustManager() {
 
             SSLContext ctx = SSLContext.getInstance(proto);
 
+            if (cipherSuites != null || protocols != null) {
+                SSLParameters sslParameters = new SSLParameters();
+
+                if (cipherSuites != null)
+                    sslParameters.setCipherSuites(cipherSuites);
+
+                if (protocols != null)
+                    sslParameters.setProtocols(protocols);
+
+                ctx = new SSLContextWrapper(ctx, sslParameters);
+            }
+
             ctx.init(keyMgrFactory.getKeyManagers(), mgrs, null);
 
             return ctx;
@@ -431,14 +509,12 @@ private KeyStore loadKeyStore(String keyStoreType, String storeFilePath, char[]
         private static final X509Certificate[] CERTS = new X509Certificate[0];
 
         /** {@inheritDoc} */
-        @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s)
-            throws CertificateException {
+        @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
             // No-op, all clients are trusted.
         }
 
         /** {@inheritDoc} */
-        @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s)
-            throws CertificateException {
+        @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
             // No-op, all servers are trusted.
         }
 
@@ -447,4 +523,4 @@ private KeyStore loadKeyStore(String keyStoreType, String storeFilePath, char[]
             return CERTS;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
index 5b8a0dcd6c00..abd27bdb1b31 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
@@ -71,12 +71,39 @@
      */
     private String walArgs;
 
-    /** Ping timeout for grid client. See {@link GridClientConfiguration#pingTimeout}.*/
+    /** Ping timeout for grid client. See {@link GridClientConfiguration#getPingTimeout()}. */
     private long pingTimeout;
 
-    /** Ping interval for grid client. See {@link GridClientConfiguration#pingInterval}.*/
+    /** Ping interval for grid client. See {@link GridClientConfiguration#getPingInterval()}. */
     private long pingInterval;
 
+    /** SSL Protocol. */
+    private String sslProtocol;
+
+    /** SSL Cipher suites. */
+    private String sslCipherSuites;
+
+    /** SSL Key Algorithm. */
+    private String sslKeyAlgorithm;
+
+    /** Keystore. */
+    private String sslKeyStorePath;
+
+    /** Keystore Type. */
+    private String sslKeyStoreType;
+
+    /** Keystore Password. */
+    private char[] sslKeyStorePassword;
+
+    /** Truststore. */
+    private String sslTrustStorePath;
+
+    /** Truststore Type. */
+    private String sslTrustStoreType;
+
+    /** Truststore Password. */
+    private char[] sslTrustStorePassword;
+
     /**
      * @param cmd Command.
      * @param host Host.
@@ -89,27 +116,57 @@
      * @param cacheArgs --cache subcommand arguments.
      * @param walAct WAL action.
      * @param walArgs WAL args.
-     * @param pingTimeout Ping timeout. See {@link GridClientConfiguration#pingTimeout}.
-     * @param pingInterval Ping interval. See {@link GridClientConfiguration#pingInterval}.
+     * @param pingTimeout Ping timeout. See {@link GridClientConfiguration#getPingTimeout()}.
+     * @param pingInterval Ping interval. See {@link GridClientConfiguration#getPingInterval()}.
      * @param autoConfirmation Auto confirmation flag.
+     * @param sslProtocol SSL Protocol.
+     * @param sslCipherSuites SSL cipher suites.
+     * @param sslKeyAlgorithm SSL Key Algorithm.
+     * @param sslKeyStorePath Keystore.
+     * @param sslKeyStorePassword Keystore Password.
+     * @param sslKeyStoreType Keystore Type.
+     * @param sslTrustStorePath Truststore.
+     * @param sslTrustStorePassword Truststore Password.
+     * @param sslTrustStoreType Truststore Type.
      */
     public Arguments(Command cmd, String host, String port, String user, String pwd, String baselineAct,
-                     String baselineArgs, VisorTxTaskArg txArg, CacheArguments cacheArgs, String walAct, String walArgs,
-                     Long pingTimeout, Long pingInterval, boolean autoConfirmation) {
+        String baselineArgs, VisorTxTaskArg txArg, CacheArguments cacheArgs, String walAct, String walArgs,
+        Long pingTimeout, Long pingInterval, boolean autoConfirmation,
+        String sslProtocol, String sslCipherSuites, String sslKeyAlgorithm,
+        String sslKeyStorePath, char[] sslKeyStorePassword, String sslKeyStoreType,
+        String sslTrustStorePath, char[] sslTrustStorePassword, String sslTrustStoreType
+    ) {
         this.cmd = cmd;
         this.host = host;
         this.port = port;
         this.user = user;
         this.pwd = pwd;
+
         this.baselineAct = baselineAct;
         this.baselineArgs = baselineArgs;
+
         this.txArg = txArg;
         this.cacheArgs = cacheArgs;
+
         this.walAct = walAct;
         this.walArgs = walArgs;
+
         this.pingTimeout = pingTimeout;
         this.pingInterval = pingInterval;
+
         this.autoConfirmation = autoConfirmation;
+
+        this.sslProtocol = sslProtocol;
+        this.sslCipherSuites = sslCipherSuites;
+
+        this.sslKeyAlgorithm = sslKeyAlgorithm;
+        this.sslKeyStorePath = sslKeyStorePath;
+        this.sslKeyStoreType = sslKeyStoreType;
+        this.sslKeyStorePassword = sslKeyStorePassword;
+
+        this.sslTrustStorePath = sslTrustStorePath;
+        this.sslTrustStoreType = sslTrustStoreType;
+        this.sslTrustStorePassword = sslTrustStorePassword;
     }
 
     /**
@@ -136,17 +193,31 @@ public String port() {
     /**
      * @return user name
      */
-    public String user() {
+    public String getUserName() {
         return user;
     }
 
+    /**
+     * @param user New user name.
+     */
+    public void setUserName(String user) {
+        this.user = user;
+    }
+
     /**
      * @return password
      */
-    public String password() {
+    public String getPassword() {
         return pwd;
     }
 
+    /**
+     * @param pwd New password.
+     */
+    public void setPassword(String pwd) {
+        this.pwd = pwd;
+    }
+
     /**
      * @return baseline action
      */
@@ -190,7 +261,7 @@ public String walArguments() {
     }
 
     /**
-     * See {@link GridClientConfiguration#pingTimeout}.
+     * See {@link GridClientConfiguration#getPingInterval()}.
      *
      * @return Ping timeout.
      */
@@ -199,7 +270,7 @@ public long pingTimeout() {
     }
 
     /**
-     * See {@link GridClientConfiguration#pingInterval}.
+     * See {@link GridClientConfiguration#getPingInterval()}.
      *
      * @return Ping interval.
      */
@@ -213,4 +284,67 @@ public long pingInterval() {
     public boolean autoConfirmation() {
         return autoConfirmation;
     }
+
+    /**
+     * @return SSL protocol
+     */
+    public String sslProtocol() {
+        return sslProtocol;
+    }
+
+    /**
+     * @return SSL cipher suites.
+     */
+    public String getSslCipherSuites() {
+        return sslCipherSuites;
+    }
+
+    /**
+     * @return SSL Key Algorithm
+     */
+    public String sslKeyAlgorithm() {
+        return sslKeyAlgorithm;
+    }
+
+    /**
+     * @return Keystore
+     */
+    public String sslKeyStorePath() {
+        return sslKeyStorePath;
+    }
+
+    /**
+     * @return Keystore type
+     */
+    public String sslKeyStoreType() {
+        return sslKeyStoreType;
+    }
+
+    /**
+     * @return Keystore password
+     */
+    public char[] sslKeyStorePassword() {
+        return sslKeyStorePassword;
+    }
+
+    /**
+     * @return Truststore
+     */
+    public String sslTrustStorePath() {
+        return sslTrustStorePath;
+    }
+
+    /**
+     * @return Truststore type
+     */
+    public String sslTrustStoreType() {
+        return sslTrustStoreType;
+    }
+
+    /**
+     * @return Truststore password
+     */
+    public char[] sslTrustStorePassword() {
+        return sslTrustStorePassword;
+    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java
index c64e488db4ff..1f7c0a34c57b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java
@@ -71,4 +71,9 @@ public static Command of(String text) {
     public String text() {
         return text;
     }
+
+    /** {@inheritDoc} */
+    @Override public String toString() { 
+        return text; 
+    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index c484018e0e56..cd9693132d67 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -17,21 +17,26 @@
 
 package org.apache.ignite.internal.commandline;
 
+import java.io.Console;
+import java.io.IOException;
+import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Scanner;
 import java.util.Set;
 import java.util.UUID;
-import java.util.logging.Logger;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.compute.ComputeTask;
@@ -49,6 +54,7 @@
 import org.apache.ignite.internal.client.GridClientNode;
 import org.apache.ignite.internal.client.GridServerUnreachableException;
 import org.apache.ignite.internal.client.impl.connection.GridClientConnectionResetException;
+import org.apache.ignite.internal.client.ssl.GridSslBasicContextFactory;
 import org.apache.ignite.internal.commandline.cache.CacheArguments;
 import org.apache.ignite.internal.commandline.cache.CacheCommand;
 import org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTask;
@@ -63,8 +69,10 @@
 import org.apache.ignite.internal.processors.cache.verify.PartitionHashRecord;
 import org.apache.ignite.internal.processors.cache.verify.PartitionKey;
 import org.apache.ignite.internal.processors.cache.verify.VerifyBackupPartitionsTaskV2;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.X;
+import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorTaskArgument;
 import org.apache.ignite.internal.visor.baseline.VisorBaselineNode;
@@ -72,11 +80,20 @@
 import org.apache.ignite.internal.visor.baseline.VisorBaselineTask;
 import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskArg;
 import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskResult;
+import org.apache.ignite.internal.visor.cache.VisorCacheAffinityConfiguration;
+import org.apache.ignite.internal.visor.cache.VisorCacheConfiguration;
+import org.apache.ignite.internal.visor.cache.VisorCacheConfigurationCollectorTask;
+import org.apache.ignite.internal.visor.cache.VisorCacheConfigurationCollectorTaskArg;
+import org.apache.ignite.internal.visor.cache.VisorCacheEvictionConfiguration;
+import org.apache.ignite.internal.visor.cache.VisorCacheNearConfiguration;
+import org.apache.ignite.internal.visor.cache.VisorCacheRebalanceConfiguration;
+import org.apache.ignite.internal.visor.cache.VisorCacheStoreConfiguration;
 import org.apache.ignite.internal.visor.misc.VisorClusterNode;
 import org.apache.ignite.internal.visor.misc.VisorWalTask;
 import org.apache.ignite.internal.visor.misc.VisorWalTaskArg;
 import org.apache.ignite.internal.visor.misc.VisorWalTaskOperation;
 import org.apache.ignite.internal.visor.misc.VisorWalTaskResult;
+import org.apache.ignite.internal.visor.query.VisorQueryConfiguration;
 import org.apache.ignite.internal.visor.tx.VisorTxInfo;
 import org.apache.ignite.internal.visor.tx.VisorTxOperation;
 import org.apache.ignite.internal.visor.tx.VisorTxProjection;
@@ -84,6 +101,8 @@
 import org.apache.ignite.internal.visor.tx.VisorTxTask;
 import org.apache.ignite.internal.visor.tx.VisorTxTaskArg;
 import org.apache.ignite.internal.visor.tx.VisorTxTaskResult;
+import org.apache.ignite.internal.visor.verify.CacheFilterEnum;
+import org.apache.ignite.internal.visor.verify.IndexIntegrityCheckIssue;
 import org.apache.ignite.internal.visor.verify.IndexValidationIssue;
 import org.apache.ignite.internal.visor.verify.ValidateIndexesPartitionResult;
 import org.apache.ignite.internal.visor.verify.VisorContentionTask;
@@ -98,12 +117,16 @@
 import org.apache.ignite.internal.visor.verify.VisorValidateIndexesJobResult;
 import org.apache.ignite.internal.visor.verify.VisorValidateIndexesTaskArg;
 import org.apache.ignite.internal.visor.verify.VisorValidateIndexesTaskResult;
+import org.apache.ignite.internal.visor.verify.VisorViewCacheCmd;
 import org.apache.ignite.internal.visor.verify.VisorViewCacheTask;
 import org.apache.ignite.internal.visor.verify.VisorViewCacheTaskArg;
 import org.apache.ignite.internal.visor.verify.VisorViewCacheTaskResult;
+import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.plugin.security.SecurityCredentials;
 import org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider;
+import org.apache.ignite.plugin.security.SecurityCredentialsProvider;
+import org.apache.ignite.ssl.SslContextFactory;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_ENABLE_EXPERIMENTAL_COMMAND;
 import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
@@ -115,21 +138,29 @@
 import static org.apache.ignite.internal.commandline.Command.STATE;
 import static org.apache.ignite.internal.commandline.Command.TX;
 import static org.apache.ignite.internal.commandline.Command.WAL;
+import static org.apache.ignite.internal.commandline.OutputFormat.MULTI_LINE;
+import static org.apache.ignite.internal.commandline.OutputFormat.SINGLE_LINE;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.CONTENTION;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.DISTRIBUTION;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.HELP;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.IDLE_VERIFY;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.LIST;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.RESET_LOST_PARTITIONS;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.VALIDATE_INDEXES;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.ADD;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.COLLECT;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.REMOVE;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.SET;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.VERSION;
+import static org.apache.ignite.internal.visor.verify.VisorViewCacheCmd.CACHES;
 import static org.apache.ignite.internal.visor.verify.VisorViewCacheCmd.GROUPS;
 import static org.apache.ignite.internal.visor.verify.VisorViewCacheCmd.SEQ;
+import static org.apache.ignite.ssl.SslContextFactory.DFLT_SSL_PROTOCOL;
 
 /**
  * Class that execute several commands passed via command line.
  */
 public class CommandHandler {
-    /** Logger. */
-    private static final Logger log = Logger.getLogger(CommandHandler.class.getName());
-
     /** */
     static final String DFLT_HOST = "127.0.0.1";
 
@@ -155,32 +186,80 @@
     private static final String CMD_AUTO_CONFIRMATION = "--yes";
 
     /** */
-    protected static final String CMD_PING_INTERVAL = "--ping-interval";
+    private static final String CMD_PING_INTERVAL = "--ping-interval";
 
     /** */
-    protected static final String CMD_PING_TIMEOUT = "--ping-timeout";
+    private static final String CMD_PING_TIMEOUT = "--ping-timeout";
 
     /** */
     private static final String CMD_DUMP = "--dump";
 
     /** */
-    private static final String CMD_SKIP_ZEROS = "--skipZeros";
+    private static final String CMD_SKIP_ZEROS = "--skip-zeros";
+
+    /** Cache filter. */
+    private static final String CACHE_FILTER = "--cache-filter";
 
     /** */
     private static final String CMD_USER_ATTRIBUTES = "--user-attributes";
 
+    // SSL configuration section
+
+    /** */
+    private static final String CMD_SSL_PROTOCOL = "--ssl-protocol";
+
+    /** */
+    private static final String CMD_SSL_KEY_ALGORITHM = "--ssl-key-algorithm";
+
+    /** */
+    private static final String CMD_SSL_CIPHER_SUITES = "--ssl-cipher-suites";
+
+    /** */
+    private static final String CMD_KEYSTORE = "--keystore";
+
+    /** */
+    private static final String CMD_KEYSTORE_PASSWORD = "--keystore-password";
+
+    /** */
+    private static final String CMD_KEYSTORE_TYPE = "--keystore-type";
+
+    /** */
+    private static final String CMD_TRUSTSTORE = "--truststore";
+
+    /** */
+    private static final String CMD_TRUSTSTORE_PASSWORD = "--truststore-password";
+
+    /** */
+    private static final String CMD_TRUSTSTORE_TYPE = "--truststore-type";
+
     /** List of optional auxiliary commands. */
     private static final Set<String> AUX_COMMANDS = new HashSet<>();
 
     static {
         AUX_COMMANDS.add(CMD_HELP);
+
         AUX_COMMANDS.add(CMD_HOST);
         AUX_COMMANDS.add(CMD_PORT);
+
         AUX_COMMANDS.add(CMD_PASSWORD);
         AUX_COMMANDS.add(CMD_USER);
+
         AUX_COMMANDS.add(CMD_AUTO_CONFIRMATION);
+
         AUX_COMMANDS.add(CMD_PING_INTERVAL);
         AUX_COMMANDS.add(CMD_PING_TIMEOUT);
+
+        AUX_COMMANDS.add(CMD_SSL_PROTOCOL);
+        AUX_COMMANDS.add(CMD_SSL_KEY_ALGORITHM);
+        AUX_COMMANDS.add(CMD_SSL_CIPHER_SUITES);
+
+        AUX_COMMANDS.add(CMD_KEYSTORE);
+        AUX_COMMANDS.add(CMD_KEYSTORE_PASSWORD);
+        AUX_COMMANDS.add(CMD_KEYSTORE_TYPE);
+
+        AUX_COMMANDS.add(CMD_TRUSTSTORE);
+        AUX_COMMANDS.add(CMD_TRUSTSTORE_PASSWORD);
+        AUX_COMMANDS.add(CMD_TRUSTSTORE_TYPE);
     }
 
     /** Broadcast uuid. */
@@ -205,10 +284,10 @@
     private static final String BASELINE_SET_VERSION = "version";
 
     /** Parameter name for validate_indexes command. */
-    static final String VI_CHECK_FIRST = "checkFirst";
+    static final String VI_CHECK_FIRST = "--check-first";
 
     /** Parameter name for validate_indexes command. */
-    static final String VI_CHECK_THROUGH = "checkThrough";
+    static final String VI_CHECK_THROUGH = "--check-through";
 
     /** */
     static final String WAL_PRINT = "print";
@@ -247,37 +326,61 @@
     private static final String VALIDATE_INDEXES_TASK = "org.apache.ignite.internal.visor.verify.VisorValidateIndexesTask";
 
     /** */
-    private static final String TX_LIMIT = "limit";
+    private static final String TX_LIMIT = "--limit";
+
+    /** */
+    private static final String TX_ORDER = "--order";
+
+    /** */
+    private static final String TX_SERVERS = "--servers";
+
+    /** */
+    private static final String TX_CLIENTS = "--clients";
 
     /** */
-    private static final String TX_ORDER = "order";
+    private static final String TX_DURATION = "--min-duration";
 
     /** */
-    public static final String CMD_TX_ORDER_START_TIME = "START_TIME";
+    private static final String TX_SIZE = "--min-size";
 
     /** */
-    private static final String TX_SERVERS = "servers";
+    private static final String TX_LABEL = "--label";
 
     /** */
-    private static final String TX_CLIENTS = "clients";
+    private static final String TX_NODES = "--nodes";
 
     /** */
-    private static final String TX_DURATION = "minDuration";
+    private static final String TX_XID = "--xid";
 
     /** */
-    private static final String TX_SIZE = "minSize";
+    private static final String TX_KILL = "--kill";
 
     /** */
-    private static final String TX_LABEL = "label";
+    private static final String OUTPUT_FORMAT = "--output-format";
 
     /** */
-    private static final String TX_NODES = "nodes";
+    private static final String CONFIG = "--config";
+
+    /** Utility name. */
+    private static final String UTILITY_NAME = "control.sh";
+
+    /** Common options. */
+    private static final String COMMON_OPTIONS = j(" ", getCommonOptions());
+
+    /** Utility name with common options. */
+    private static final String UTILITY_NAME_WITH_COMMON_OPTIONS = j(" ", UTILITY_NAME, COMMON_OPTIONS);
+
+    /** Indent for help output. */
+    private static final String INDENT = "  ";
 
     /** */
-    private static final String TX_XID = "xid";
+    private static final String NULL = "null";
 
     /** */
-    private static final String TX_KILL = "kill";
+    private static final String NODE_ID = "nodeId";
+
+    /** */
+    private static final String OP_NODE_ID = op(NODE_ID);
 
     /** */
     private Iterator<String> argsIt;
@@ -294,6 +397,34 @@
     /** Check if experimental commands are enabled. Default {@code false}. */
     private final boolean enableExperimental = IgniteSystemProperties.getBoolean(IGNITE_ENABLE_EXPERIMENTAL_COMMAND, false);
 
+    /**
+     * Creates list of common utility options.
+     *
+     * @return List of common utility options.
+     */
+    private static List<String> getCommonOptions() {
+        List<String> list = new ArrayList<>(32);
+
+        list.add(op(CMD_HOST, "HOST_OR_IP"));
+        list.add(op(CMD_PORT, "PORT"));
+        list.add(op(CMD_USER, "USER"));
+        list.add(op(CMD_PASSWORD, "PASSWORD"));
+        list.add(op(CMD_PING_INTERVAL, "PING_INTERVAL"));
+        list.add(op(CMD_PING_TIMEOUT, "PING_TIMEOUT"));
+
+        list.add(op(CMD_SSL_PROTOCOL, "SSL_PROTOCOL[, SSL_PROTOCOL_2, ..., SSL_PROTOCOL_N]"));
+        list.add(op(CMD_SSL_CIPHER_SUITES, "SSL_CIPHER_1[, SSL_CIPHER_2, ..., SSL_CIPHER_N]"));
+        list.add(op(CMD_SSL_KEY_ALGORITHM, "SSL_KEY_ALGORITHM"));
+        list.add(op(CMD_KEYSTORE_TYPE, "KEYSTORE_TYPE"));
+        list.add(op(CMD_KEYSTORE, "KEYSTORE_PATH"));
+        list.add(op(CMD_KEYSTORE_PASSWORD, "KEYSTORE_PASSWORD"));
+        list.add(op(CMD_TRUSTSTORE_TYPE, "TRUSTSTORE_TYPE"));
+        list.add(op(CMD_TRUSTSTORE, "TRUSTSTORE_PATH"));
+        list.add(op(CMD_TRUSTSTORE_PASSWORD, "TRUSTSTORE_PASSWORD"));
+
+        return list;
+    }
+
     /**
      * Output specified string to console.
      *
@@ -303,6 +434,57 @@ private void log(String s) {
         System.out.println(s);
     }
 
+    /**
+     * Adds indent to begin of object's string representation.
+     *
+     * @param o Input object.
+     * @return Indented string.
+     */
+    private static String i(Object o) {
+        return i(o, 1);
+    }
+
+    /**
+     * Adds specified indents to begin of object's string representation.
+     *
+     * @param o Input object.
+     * @param indentCnt Number of indents.
+     * @return Indented string.
+     */
+    private static String i(Object o, int indentCnt) {
+        assert indentCnt >= 0;
+
+        String s = o == null ? null : o.toString();
+
+        switch (indentCnt) {
+            case 0:
+                return s;
+
+            case 1:
+                return INDENT + s;
+
+            default:
+                int sLen = s == null ? 4 : s.length();
+
+                SB sb = new SB(sLen + indentCnt * INDENT.length());
+
+                for (int i = 0; i < indentCnt; i++)
+                    sb.a(INDENT);
+
+                return sb.a(s).toString();
+        }
+    }
+
+    /**
+     * Format and output specified string to console.
+     *
+     * @param format A format string as described in Format string syntax.
+     * @param args Arguments referenced by the format specifiers in the format string.
+     */
+    private void log(String format, Object... args) {
+        System.out.printf(format, args);
+    }
+
     /**
      * Provides a prompt, then reads a single line of text from the console.
      *
@@ -319,7 +501,7 @@ private String readLine(String prompt) {
      * Output empty line.
      */
     private void nl() {
-        System.out.println("");
+        System.out.println();
     }
 
     /**
@@ -490,6 +672,41 @@ private void state(GridClient client) throws Throwable {
         return executeTaskByNameOnNode(client, taskCls.getName(), taskArgs, null);
     }
 
+    /**
+     * @param client Client.
+     * @return List of hosts.
+     */
+    private Stream<IgniteBiTuple<GridClientNode, String>> listHosts(GridClient client) throws GridClientException {
+        return client.compute()
+            .nodes(GridClientNode::connectable)
+            .stream()
+            .flatMap(node -> Stream.concat(
+                node.tcpAddresses() == null ? Stream.empty() : node.tcpAddresses().stream(),
+                node.tcpHostNames() == null ? Stream.empty() : node.tcpHostNames().stream()
+            )
+            .map(addr -> new IgniteBiTuple<>(node, addr + ":" + node.tcpPort())));
+    }
+
+    /**
+     * @param client Client.
+     * @return List of hosts.
+     */
+    private Stream<IgniteBiTuple<GridClientNode, List<String>>> listHostsByClientNode(
+        GridClient client
+    ) throws GridClientException {
+        return client.compute().nodes(GridClientNode::connectable).stream()
+            .map(
+                node -> new IgniteBiTuple<>(
+                    node,
+                    Stream.concat(
+                        node.tcpAddresses() == null ? Stream.empty() : node.tcpAddresses().stream(),
+                        node.tcpHostNames() == null ? Stream.empty() : node.tcpHostNames().stream()
+                    )
+                    .map(addr -> addr + ":" + node.tcpPort()).collect(Collectors.toList())
+                )
+            );
+    }
+
     /**
      * @param client Client
      * @param taskClsName Task class name.
@@ -498,7 +715,12 @@ private void state(GridClient client) throws Throwable {
      * @return Task result.
      * @throws GridClientException If failed to execute task.
      */
-    private <R> R executeTaskByNameOnNode(GridClient client, String taskClsName, Object taskArgs, UUID nodeId
+    @SuppressWarnings("unchecked")
+    private <R> R executeTaskByNameOnNode(
+        GridClient client,
+        String taskClsName,
+        Object taskArgs,
+        UUID nodeId
     ) throws GridClientException {
         GridClientCompute compute = client.compute();
 
@@ -518,22 +740,34 @@ private void state(GridClient client) throws Throwable {
         GridClientNode node = null;
 
         if (nodeId == null) {
-            Collection<GridClientNode> nodes = compute.nodes(GridClientNode::connectable);
-
             // Prefer node from connect string.
-            String origAddr = clientCfg.getServers().iterator().next();
+            final String cfgAddr = clientCfg.getServers().iterator().next();
 
-            for (GridClientNode clientNode : nodes) {
-                Iterator<String> it = F.concat(clientNode.tcpAddresses().iterator(), clientNode.tcpHostNames().iterator());
+            String[] parts = cfgAddr.split(":");
 
-                while (it.hasNext()) {
-                    if (origAddr.equals(it.next() + ":" + clientNode.tcpPort())) {
-                        node = clientNode;
+            if (DFLT_HOST.equals(parts[0])) {
+                InetAddress addr;
 
-                        break;
-                    }
+                try {
+                    addr = IgniteUtils.getLocalHost();
+                }
+                catch (IOException e) {
+                    throw new GridClientException("Can't get localhost name.", e);
                 }
+
+                if (addr.isLoopbackAddress())
+                    throw new GridClientException("Can't find localhost name.");
+
+                String origAddr = addr.getHostName() + ":" + parts[1];
+
+                node = listHosts(client).filter(tuple -> origAddr.equals(tuple.get2())).findFirst().map(IgniteBiTuple::get1).orElse(null);
+
+                if (node == null)
+                    node = listHostsByClientNode(client).filter(tuple -> tuple.get2().size() == 1 && cfgAddr.equals(tuple.get2().get(0))).
+                        findFirst().map(IgniteBiTuple::get1).orElse(null);
             }
+            else
+                node = listHosts(client).filter(tuple -> cfgAddr.equals(tuple.get2())).findFirst().map(IgniteBiTuple::get1).orElse(null);
 
             // Otherwise choose random node.
             if (node == null)
@@ -613,23 +847,23 @@ private void cache(GridClient client, CacheArguments cacheArgs) throws Throwable
         }
     }
 
-    /**
-     *
-     */
+    /** */
     private void printCacheHelp() {
-        log("--cache subcommand allows to do the following operations:");
-
-        usage("  Show information about caches, groups or sequences that match a regex:", CACHE, " list regexPattern [groups|seq] [nodeId]");
-        usage("  Show hot keys that are point of contention for multiple transactions:", CACHE, " contention minQueueSize [nodeId] [maxPrint]");
-        usage("  Verify partition counters and hashes between primary and backups on idle cluster:", CACHE, " idle_verify [--dump] [--skipZeros] [cache1,...,cacheN]");
-        usage("  Validate custom indexes on idle cluster:", CACHE, " validate_indexes [cache1,...,cacheN] [nodeId] [checkFirst|checkThrough]");
-        usage("  Collect partition distribution information:", CACHE, " distribution nodeId|null [cacheName1,...,cacheNameN] [--user-attributes attributeName1[,...,attributeNameN]]");
-        usage("  Reset lost partitions:", CACHE, " reset_lost_partitions cacheName1[,...,cacheNameN]");
-
-        log("  If [nodeId] is not specified, contention and validate_indexes commands will be broadcasted to all server nodes.");
-        log("  Another commands where [nodeId] is optional will run on a random server node.");
-        log("  checkFirst numeric parameter for validate_indexes specifies number of first K keys to be validated.");
-        log("  checkThrough numeric parameter for validate_indexes allows to check each Kth key.");
+        log(i("The '" + CACHE + " subcommand' is used to get information about and perform actions with caches. The command has the following syntax:"));
+        nl();
+        log(i(UTILITY_NAME_WITH_COMMON_OPTIONS + " " + CACHE + "[subcommand] <subcommand_parameters>"));
+        nl();
+        log(i("The subcommands that take " + OP_NODE_ID + " as an argument ('" + LIST + "', '" + CONTENTION + "' and '" + VALIDATE_INDEXES + "') will be executed on the given node or on all server nodes if the option is not specified. Other commands will run on a random server node."));
+        nl();
+        nl();
+        log(i("Subcommands:"));
+
+        usageCache(LIST, "regexPattern", op(or("groups", "seq")), OP_NODE_ID, op(CONFIG), op(OUTPUT_FORMAT, MULTI_LINE));
+        usageCache(CONTENTION, "minQueueSize", OP_NODE_ID, op("maxPrint"));
+        usageCache(IDLE_VERIFY, op(CMD_DUMP), op(CMD_SKIP_ZEROS), "[cache1,...,cacheN]", op(CACHE_FILTER, or(CacheFilterEnum.values())));
+        usageCache(VALIDATE_INDEXES, "[cache1,...,cacheN]", OP_NODE_ID, op(or(VI_CHECK_FIRST + " N", VI_CHECK_THROUGH + " K")));
+        usageCache(DISTRIBUTION, or(NODE_ID, NULL), "[cacheName1,...,cacheNameN]", op(CMD_USER_ATTRIBUTES, "attrName1,...,attrNameN"));
+        usageCache(RESET_LOST_PARTITIONS, "cacheName1,...,cacheNameN");
         nl();
     }
 
@@ -650,7 +884,7 @@ private void cacheContention(GridClient client, CacheArguments cacheArgs) throws
             log("Contention check failed on nodes:");
 
             for (Map.Entry<UUID, Exception> e : res.exceptions().entrySet()) {
-                log("Node ID = " + e.getKey());
+                log("Node ID: " + e.getKey());
 
                 log("Exception message:");
                 log(e.getValue().getMessage());
@@ -669,42 +903,55 @@ private void cacheContention(GridClient client, CacheArguments cacheArgs) throws
     private void cacheValidateIndexes(GridClient client, CacheArguments cacheArgs) throws GridClientException {
         VisorValidateIndexesTaskArg taskArg = new VisorValidateIndexesTaskArg(
             cacheArgs.caches(),
+            cacheArgs.nodeId() != null ? Collections.singleton(cacheArgs.nodeId()) : null,
             cacheArgs.checkFirst(),
             cacheArgs.checkThrough()
         );
 
-        UUID nodeId = cacheArgs.nodeId() == null ? BROADCAST_UUID : cacheArgs.nodeId();
-
         VisorValidateIndexesTaskResult taskRes = executeTaskByNameOnNode(
-            client, VALIDATE_INDEXES_TASK, taskArg, nodeId);
+            client, VALIDATE_INDEXES_TASK, taskArg, null);
+
+        boolean errors = false;
 
         if (!F.isEmpty(taskRes.exceptions())) {
+            errors = true;
+
             log("Index validation failed on nodes:");
 
             for (Map.Entry<UUID, Exception> e : taskRes.exceptions().entrySet()) {
-                log("Node ID = " + e.getKey());
+                log(i("Node ID: " + e.getKey()));
 
-                log("Exception message:");
-                log(e.getValue().getMessage());
+                log(i("Exception message:"));
+                log(i(e.getValue().getMessage(), 2));
                 nl();
             }
         }
 
-        boolean errors = false;
-
         for (Map.Entry<UUID, VisorValidateIndexesJobResult> nodeEntry : taskRes.results().entrySet()) {
+            if (!nodeEntry.getValue().hasIssues())
+                continue;
+
+            errors = true;
+
+            log("Index issues found on node " + nodeEntry.getKey() + ":");
+
+            Collection<IndexIntegrityCheckIssue> integrityCheckFailures = nodeEntry.getValue().integrityCheckFailures();
+
+            if (!integrityCheckFailures.isEmpty()) {
+                for (IndexIntegrityCheckIssue is : integrityCheckFailures)
+                    log(i(is));
+            }
+
             Map<PartitionKey, ValidateIndexesPartitionResult> partRes = nodeEntry.getValue().partitionResult();
 
             for (Map.Entry<PartitionKey, ValidateIndexesPartitionResult> e : partRes.entrySet()) {
                 ValidateIndexesPartitionResult res = e.getValue();
 
                 if (!res.issues().isEmpty()) {
-                    errors = true;
-
-                    log(e.getKey().toString() + " " + e.getValue().toString());
+                    log(i(j(" ", e.getKey(), e.getValue())));
 
                     for (IndexValidationIssue is : res.issues())
-                        log(is.toString());
+                        log(i(is, 2));
                 }
             }
 
@@ -714,20 +961,20 @@ private void cacheValidateIndexes(GridClient client, CacheArguments cacheArgs) t
                 ValidateIndexesPartitionResult res = e.getValue();
 
                 if (!res.issues().isEmpty()) {
-                    errors = true;
-
-                    log("SQL Index " + e.getKey() + " " + e.getValue().toString());
+                    log(i(j(" ", "SQL Index", e.getKey(), e.getValue())));
 
                     for (IndexValidationIssue is : res.issues())
-                        log(is.toString());
+                        log(i(is, 2));
                 }
             }
         }
 
         if (!errors)
-            log("validate_indexes has finished, no issues found.");
+            log("no issues found.");
         else
-            log("validate_indexes has finished with errors (listed above).");
+            log("issues found (listed above).");
+
+        nl();
     }
 
     /**
@@ -740,8 +987,11 @@ private void cacheView(GridClient client, CacheArguments cacheArgs) throws GridC
         VisorViewCacheTaskResult res = executeTaskByNameOnNode(
             client, VisorViewCacheTask.class.getName(), taskArg, cacheArgs.nodeId());
 
-        for (CacheInfo info : res.cacheInfos())
-            info.print(cacheArgs.cacheCommand());
+        if (cacheArgs.fullConfig() && cacheArgs.cacheCommand() == CACHES)
+            cachesConfig(client, cacheArgs, res);
+        else
+            printCacheInfos(res.cacheInfos(), cacheArgs.cacheCommand());
+
     }
 
     /**
@@ -816,6 +1066,100 @@ private void cacheDistribution(GridClient client, CacheArguments cacheArgs) thro
         res.print(System.out);
     }
 
+    /**
+     * @param client Client.
+     * @param cacheArgs Cache args.
+     * @param viewRes Cache view task result.
+     */
+    private void cachesConfig(GridClient client, CacheArguments cacheArgs,
+        VisorViewCacheTaskResult viewRes) throws GridClientException {
+        VisorCacheConfigurationCollectorTaskArg taskArg = new VisorCacheConfigurationCollectorTaskArg(cacheArgs.regex());
+
+        UUID nodeId = cacheArgs.nodeId() == null ? BROADCAST_UUID : cacheArgs.nodeId();
+
+        Map<String, VisorCacheConfiguration> res =
+            executeTaskByNameOnNode(client, VisorCacheConfigurationCollectorTask.class.getName(), taskArg, nodeId);
+
+        Map<String, Integer> cacheToMapped =
+            viewRes.cacheInfos().stream().collect(Collectors.toMap(CacheInfo::getCacheName, CacheInfo::getMapped));
+
+        printCachesConfig(res, cacheArgs.outputFormat(), cacheToMapped);
+    }
+
+    /**
+     * Prints caches info.
+     *
+     * @param infos Caches info.
+     * @param cmd Command.
+     */
+    private void printCacheInfos(Collection<CacheInfo> infos, VisorViewCacheCmd cmd) {
+        for (CacheInfo info : infos) {
+            Map<String, Object> map = info.toMap(cmd);
+
+            SB sb = new SB("[");
+
+            for (Map.Entry<String, Object> e : map.entrySet())
+                sb.a(e.getKey()).a("=").a(e.getValue()).a(", ");
+
+            sb.setLength(sb.length() - 2);
+
+            sb.a("]");
+
+            log(sb.toString());
+        }
+    }
+
+    /**
+     * Prints caches config.
+     *
+     * @param caches Caches config.
+     * @param outputFormat Output format.
+     * @param cacheToMapped Map cache name to mapped.
+     */
+    private void printCachesConfig(
+        Map<String, VisorCacheConfiguration> caches,
+        OutputFormat outputFormat,
+        Map<String, Integer> cacheToMapped
+    ) {
+
+        for (Map.Entry<String, VisorCacheConfiguration> entry : caches.entrySet()) {
+            String cacheName = entry.getKey();
+
+            switch (outputFormat) {
+                case MULTI_LINE:
+                    Map<String, Object> params = mapToPairs(entry.getValue());
+
+                    params.put("Mapped", cacheToMapped.get(cacheName));
+
+                    log("[cache = '%s']%n", cacheName);
+
+                    for (Map.Entry<String, Object> innerEntry : params.entrySet())
+                        log("%s: %s%n", innerEntry.getKey(), innerEntry.getValue());
+
+                    nl();
+
+                    break;
+
+                default:
+                    int mapped = cacheToMapped.get(cacheName);
+
+                    log("%s: %s %s=%s%n", entry.getKey(), toString(entry.getValue()), "mapped", mapped);
+
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Invokes toString() method and cuts class name from result string.
+     *
+     * @param cfg Visor cache configuration for invocation.
+     * @return String representation without class name in begin of string.
+     */
+    private String toString(VisorCacheConfiguration cfg) {
+        return cfg.toString().substring(cfg.getClass().getSimpleName().length() + 1);
+    }
+
     /**
      * @param client Client.
      * @param cacheArgs Cache args.
@@ -837,7 +1181,7 @@ private void cacheIdleVerifyDump(GridClient client, CacheArguments cacheArgs) th
         String path = executeTask(
             client,
             VisorIdleVerifyDumpTask.class,
-            new VisorIdleVerifyDumpTaskArg(cacheArgs.caches(), cacheArgs.isSkipZeros())
+            new VisorIdleVerifyDumpTaskArg(cacheArgs.caches(), cacheArgs.isSkipZeros(), cacheArgs.getCacheFilterEnum())
         );
 
         log("VisorIdleVerifyDumpTask successfully written output to '" + path + "'");
@@ -954,8 +1298,9 @@ private void baselinePrint0(VisorBaselineTaskResult res) {
             log("Baseline nodes:");
 
             for (VisorBaselineNode node : baseline.values()) {
-                log("    ConsistentID=" + node.getConsistentId() + ", STATE=" +
-                    (srvs.containsKey(node.getConsistentId()) ? "ONLINE" : "OFFLINE"));
+                boolean online = srvs.containsKey(node.getConsistentId());
+
+                log(i("ConsistentID=" + node.getConsistentId() + ", STATE=" + (online ? "ONLINE" : "OFFLINE"), 2));
             }
 
             log(DELIM);
@@ -976,7 +1321,7 @@ private void baselinePrint0(VisorBaselineTaskResult res) {
                 log("Other nodes:");
 
                 for (VisorBaselineNode node : others)
-                    log("    ConsistentID=" + node.getConsistentId());
+                    log(i("ConsistentID=" + node.getConsistentId(), 2));
 
                 log("Number of other nodes: " + others.size());
             }
@@ -1209,10 +1554,10 @@ private void printUnusedWalSegments0(VisorWalTaskResult taskRes) {
             VisorClusterNode node = nodesInfo.get(entry.getKey());
 
             log("Node=" + node.getConsistentId());
-            log("     addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()));
+            log(i("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()), 2));
 
             for (String fileName : entry.getValue())
-                log("   " + fileName);
+                log(i(fileName));
 
             nl();
         }
@@ -1221,8 +1566,8 @@ private void printUnusedWalSegments0(VisorWalTaskResult taskRes) {
             VisorClusterNode node = nodesInfo.get(entry.getKey());
 
             log("Node=" + node.getConsistentId());
-            log("     addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()));
-            log("   failed with error: " + entry.getValue().getMessage());
+            log(i("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())), 2);
+            log(i("failed with error: " + entry.getValue().getMessage()));
             nl();
         }
     }
@@ -1244,7 +1589,7 @@ private void printDeleteWalSegments0(VisorWalTaskResult taskRes) {
             VisorClusterNode node = nodesInfo.get(entry.getKey());
 
             log("Node=" + node.getConsistentId());
-            log("     addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()));
+            log(i("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())), 2);
             nl();
         }
 
@@ -1252,8 +1597,8 @@ private void printDeleteWalSegments0(VisorWalTaskResult taskRes) {
             VisorClusterNode node = nodesInfo.get(entry.getKey());
 
             log("Node=" + node.getConsistentId());
-            log("     addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()));
-            log("   failed with error: " + entry.getValue().getMessage());
+            log(i("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())), 2);
+            log(i("failed with error: " + entry.getValue().getMessage()));
             nl();
         }
     }
@@ -1286,11 +1631,190 @@ private boolean isConnectionError(Throwable e) {
      */
     private void usage(String desc, Command cmd, String... args) {
         log(desc);
-        log("    control.sh [--host HOST_OR_IP] [--port PORT] [--user USER] [--password PASSWORD] " +
-            " [--ping-interval PING_INTERVAL] [--ping-timeout PING_TIMEOUT] " + cmd.text() + String.join("", args));
+        log(i(j(" ", UTILITY_NAME, cmd, j(" ", args)), 2));
         nl();
     }
 
+    /**
+     * Print cache command usage with default indention.
+     *
+     * @param cmd Cache command.
+     * @param args Cache command arguments.
+     */
+    private void usageCache(CacheCommand cmd, String... args) {
+        usageCache(1, cmd, args);
+    }
+
+    /**
+     * Print cache command usage.
+     *
+     * @param indentsNum Number of indents.
+     * @param cmd Cache command.
+     * @param args Cache command arguments.
+     */
+    private void usageCache(int indentsNum, CacheCommand cmd, String... args) {
+        log(i(DELIM, indentsNum));
+        nl();
+        log(i(j(" ", CACHE, cmd, j(" ", args)), indentsNum++));
+        nl();
+        log(i(getCacheSubcommandDesc(cmd), indentsNum));
+        nl();
+
+        Map<String, String> paramsDesc = createCacheArgsDesc(cmd);
+
+        if (!paramsDesc.isEmpty()) {
+            log(i("Parameters:", indentsNum));
+
+            usageCacheParams(paramsDesc, indentsNum + 1);
+
+            nl();
+        }
+    }
+
+    /**
+     * Print cache command arguments usage.
+     *
+     * @param paramsDesc Cache command arguments description.
+     * @param indentsNum Number of indents.
+     */
+    private void usageCacheParams(Map<String, String> paramsDesc, int indentsNum) {
+        int maxParamLen = paramsDesc.keySet().stream().max(Comparator.comparingInt(String::length)).get().length();
+
+        for (Map.Entry<String, String> param : paramsDesc.entrySet())
+            log(i(extendToLen(param.getKey(), maxParamLen) + INDENT + "- " + param.getValue(), indentsNum));
+    }
+
+    /**
+     * Appends spaces to end of input string for extending to needed length.
+     *
+     * @param s Input string.
+     * @param targetLen Needed length.
+     * @return String with appended spaces on the end.
+     */
+    private String extendToLen(String s, int targetLen) {
+        assert targetLen >= 0;
+        assert s.length() <= targetLen;
+
+        if (s.length() == targetLen)
+            return s;
+
+        SB sb = new SB(targetLen);
+
+        sb.a(s);
+
+        for (int i = 0; i < targetLen - s.length(); i++)
+            sb.a(" ");
+
+        return sb.toString();
+    }
+
+    /**
+     * Gets cache command description by cache command.
+     *
+     * @param cmd Cache command.
+     * @return Cache command description.
+     */
+    private String getCacheSubcommandDesc(CacheCommand cmd) {
+        switch (cmd) {
+            case LIST:
+                return "Show information about caches, groups or sequences that match a regular expression. When executed without parameters, this subcommand prints the list of caches.";
+
+            case CONTENTION:
+                return "Show the keys that are point of contention for multiple transactions.";
+
+            case IDLE_VERIFY:
+                return "Verify counters and hash sums of primary and backup partitions for the specified caches on an idle cluster and print out the differences, if any.";
+
+            case VALIDATE_INDEXES:
+                return "Validate indexes on an idle cluster and print out the keys that are missing in the indexes.";
+
+            case DISTRIBUTION:
+                return "Prints the information about partition distribution.";
+
+            case RESET_LOST_PARTITIONS:
+                return "Reset the state of lost partitions for the specified caches.";
+
+            default:
+                throw new IllegalArgumentException("Unknown command: " + cmd);
+        }
+    }
+
+    /**
+     * Gets cache command arguments description by cache command.
+     *
+     * @param cmd Cache command.
+     * @return Cache command arguments description.
+     */
+    private Map<String, String> createCacheArgsDesc(CacheCommand cmd) {
+        Map<String, String> map = U.newLinkedHashMap(16);
+        switch (cmd) {
+            case LIST:
+                map.put(CONFIG, "print a all configuration parameters for each cache.");
+                map.put(OUTPUT_FORMAT + " " + MULTI_LINE.text(), "print configuration parameters per line. This option has effect only when used with " + CONFIG + " and without [groups|seq].");
+
+                break;
+            case VALIDATE_INDEXES:
+                map.put(VI_CHECK_FIRST + " N", "validate only the first N keys");
+                map.put(VI_CHECK_THROUGH + " K", "validate every Kth key");
+
+                break;
+        }
+        return map;
+    }
+
+    /**
+     * Join input parameters with space and wrap optional braces {@code []}.
+     *
+     * @param params Other input parameter.
+     * @return Joined parameters wrapped optional braces.
+     */
+    private static String op(Object... params) {
+        return j(new SB(), "[", " ", params).a("]").toString();
+    }
+
+    /**
+     * Join input parameters with specified {@code delimeter} between them.
+     *
+     * @param delimeter Specified delimeter.
+     * @param params Other input parameter.
+     * @return Joined paramaters with specified {@code delimeter}.
+     */
+    private static String j(String delimeter, Object... params) {
+        return j(new SB(), "", delimeter, params).toString();
+    }
+
+    /**
+     * Join input parameters with specified {@code delimeter} between them and append to the end {@code delimeter}.
+     *
+     * @param sb Specified string builder.
+     * @param sbDelimeter Delimeter between {@code sb} and appended {@code param}.
+     * @param delimeter Specified delimeter.
+     * @param params Other input parameter.
+     * @return SB with appended to the end joined paramaters with specified {@code delimeter}.
+     */
+    private static SB j(SB sb, String sbDelimeter, String delimeter, Object... params) {
+        if (!F.isEmpty(params)) {
+            sb.a(sbDelimeter);
+
+            for (Object par : params)
+                sb.a(par).a(delimeter);
+
+            sb.setLength(sb.length() - delimeter.length());
+        }
+
+        return sb;
+    }
+
+    /**
+     * Concatenates input parameters to single string with OR delimiter {@code |}.
+     *
+     * @param params Remaining parameters.
+     * @return Concatenated string.
+     */
+    private static String or(Object... params) {
+        return j("|", params);
+    }
+
     /**
      * Extract next argument.
      *
@@ -1362,6 +1886,24 @@ Arguments parseAndValidate(List<String> rawArgs) {
 
         VisorTxTaskArg txArgs = null;
 
+        String sslProtocol = DFLT_SSL_PROTOCOL;
+
+        String sslCipherSuites = "";
+
+        String sslKeyAlgorithm = SslContextFactory.DFLT_KEY_ALGORITHM;
+
+        String sslKeyStoreType = SslContextFactory.DFLT_STORE_TYPE;
+
+        String sslKeyStorePath = null;
+
+        char sslKeyStorePassword[] = null;
+
+        String sslTrustStoreType = SslContextFactory.DFLT_STORE_TYPE;
+
+        String sslTrustStorePath = null;
+
+        char sslTrustStorePassword[] = null;
+
         while (hasNextArg()) {
             String str = nextArg("").toLowerCase();
 
@@ -1474,6 +2016,51 @@ Arguments parseAndValidate(List<String> rawArgs) {
 
                         break;
 
+                    case CMD_SSL_PROTOCOL:
+                        sslProtocol = nextArg("Expected SSL protocol");
+
+                        break;
+
+                    case CMD_SSL_CIPHER_SUITES:
+                        sslCipherSuites = nextArg("Expected SSL cipher suites");
+
+                        break;
+
+                    case CMD_SSL_KEY_ALGORITHM:
+                        sslKeyAlgorithm = nextArg("Expected SSL key algorithm");
+
+                        break;
+
+                    case CMD_KEYSTORE:
+                        sslKeyStorePath = nextArg("Expected SSL key store path");
+
+                        break;
+
+                    case CMD_KEYSTORE_PASSWORD:
+                        sslKeyStorePassword = nextArg("Expected SSL key store password").toCharArray();
+
+                        break;
+
+                    case CMD_KEYSTORE_TYPE:
+                        sslKeyStoreType = nextArg("Expected SSL key store type");
+
+                        break;
+
+                    case CMD_TRUSTSTORE:
+                        sslTrustStorePath = nextArg("Expected SSL trust store path");
+
+                        break;
+
+                    case CMD_TRUSTSTORE_PASSWORD:
+                        sslTrustStorePassword = nextArg("Expected SSL trust store password").toCharArray();
+
+                        break;
+
+                    case CMD_TRUSTSTORE_TYPE:
+                        sslTrustStoreType = nextArg("Expected SSL trust store type");
+
+                        break;
+
                     case CMD_AUTO_CONFIRMATION:
                         autoConfirmation = true;
 
@@ -1495,14 +2082,14 @@ Arguments parseAndValidate(List<String> rawArgs) {
 
         Command cmd = commands.get(0);
 
-        boolean hasUsr = F.isEmpty(user);
-        boolean hasPwd = F.isEmpty(pwd);
-
-        if (hasUsr != hasPwd)
-            throw new IllegalArgumentException("Both user and password should be specified");
-
-        return new Arguments(cmd, host, port, user, pwd, baselineAct, baselineArgs, txArgs, cacheArgs, walAct, walArgs,
-            pingTimeout, pingInterval, autoConfirmation);
+        return new Arguments(cmd, host, port, user, pwd,
+            baselineAct, baselineArgs,
+            txArgs, cacheArgs,
+            walAct, walArgs,
+            pingTimeout, pingInterval, autoConfirmation,
+            sslProtocol, sslCipherSuites,
+            sslKeyAlgorithm, sslKeyStorePath, sslKeyStorePassword, sslKeyStoreType,
+            sslTrustStorePath, sslTrustStorePassword, sslTrustStoreType);
     }
 
     /**
@@ -1541,6 +2128,12 @@ private CacheArguments parseAndValidateCacheArgs() {
                         cacheArgs.dump(true);
                     else if (CMD_SKIP_ZEROS.equals(nextArg))
                         cacheArgs.skipZeros(true);
+                    else if (CACHE_FILTER.equals(nextArg)) {
+                        String filter = nextArg("The cache filter should be specified. The following values can be " +
+                            "used: " + Arrays.toString(CacheFilterEnum.values()) + '.');
+
+                        cacheArgs.setCacheFilterEnum(CacheFilterEnum.valueOf(filter.toUpperCase()));
+                    }
                     else
                         parseCacheNames(nextArg, cacheArgs);
                 }
@@ -1612,27 +2205,27 @@ else if (CMD_SKIP_ZEROS.equals(nextArg))
 
             case DISTRIBUTION:
                 String nodeIdStr = nextArg("Node id expected or null");
-                if (!"null".equals(nodeIdStr))
+                if (!NULL.equals(nodeIdStr))
                     cacheArgs.nodeId(UUID.fromString(nodeIdStr));
 
                 while (hasNextCacheArg()) {
                     String nextArg = nextArg("");
 
-                    if (CMD_USER_ATTRIBUTES.equals(nextArg)){
+                    if (CMD_USER_ATTRIBUTES.equals(nextArg)) {
                         nextArg = nextArg("User attributes are expected to be separated by commas");
 
-                        Set<String> userAttributes = new HashSet();
+                        Set<String> userAttrs = new HashSet<>();
 
-                        for (String userAttribute:nextArg.split(","))
-                            userAttributes.add(userAttribute.trim());
+                        for (String userAttribute : nextArg.split(","))
+                            userAttrs.add(userAttribute.trim());
 
-                        cacheArgs.setUserAttributes(userAttributes);
+                        cacheArgs.setUserAttributes(userAttrs);
 
                         nextArg = (hasNextCacheArg()) ? nextArg("") : null;
 
                     }
 
-                    if (nextArg!=null)
+                    if (nextArg != null)
                         parseCacheNames(nextArg, cacheArgs);
                 }
 
@@ -1643,20 +2236,36 @@ else if (CMD_SKIP_ZEROS.equals(nextArg))
 
                 break;
 
-            default:
+            case LIST:
                 cacheArgs.regex(nextArg("Regex is expected"));
 
-                if (hasNextCacheArg()) {
-                    String tmp = nextArg("");
+                VisorViewCacheCmd cacheCmd = CACHES;
+
+                OutputFormat outputFormat = SINGLE_LINE;
+
+                while (hasNextCacheArg()) {
+                    String tmp = nextArg("").toLowerCase();
 
                     switch (tmp) {
                         case "groups":
-                            cacheArgs.cacheCommand(GROUPS);
+                            cacheCmd = GROUPS;
 
                             break;
 
                         case "seq":
-                            cacheArgs.cacheCommand(SEQ);
+                            cacheCmd = SEQ;
+
+                            break;
+
+                        case OUTPUT_FORMAT:
+                            String tmp2 = nextArg("output format must be defined!").toLowerCase();
+
+                            outputFormat = OutputFormat.fromConsoleName(tmp2);
+
+                            break;
+
+                        case CONFIG:
+                            cacheArgs.fullConfig(true);
 
                             break;
 
@@ -1665,7 +2274,13 @@ else if (CMD_SKIP_ZEROS.equals(nextArg))
                     }
                 }
 
+                cacheArgs.cacheCommand(cacheCmd);
+                cacheArgs.outputFormat(outputFormat);
+
                 break;
+
+            default:
+                throw new IllegalArgumentException("Unknown --cache subcommand " + cmd);
         }
 
         if (hasNextCacheArg())
@@ -1760,7 +2375,7 @@ private VisorTxTaskArg parseTransactionArguments() {
                 case TX_ORDER:
                     nextArg("");
 
-                    sortOrder = VisorTxSortOrder.fromString(nextArg(TX_ORDER));
+                    sortOrder = VisorTxSortOrder.valueOf(nextArg(TX_ORDER).toUpperCase());
 
                     break;

  (This diff was longer than 20,000 lines, and has been truncated...)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services