You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2020/07/22 18:53:20 UTC

[ignite] branch master updated: IGNITE-13222 .NET: Consolidate tests - remove DotNetCore folder

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

ptupitsyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 77202bc  IGNITE-13222 .NET: Consolidate tests - remove DotNetCore folder
77202bc is described below

commit 77202bc1c6467ed6b9b929c136961ed661c968ec
Author: Pavel Tupitsyn <pt...@apache.org>
AuthorDate: Wed Jul 22 21:52:56 2020 +0300

    IGNITE-13222 .NET: Consolidate tests - remove DotNetCore folder
    
    * Consolidate .NET Core and .NET Classic tests - use a single folder. All new tests will we included into DotNetCore.csproj by default
    * ~1100 more tests now run on Linux
    * Fix code analysis warnings for .NET Core solution
    * Fix some flaky tests
    * Update DEVNOTES, remove obsolete README.txt
    * Use `[Explicit]` for API parity tests instead of `[Ignore]` (Ignore = never run, Explicit = run manually)
---
 .../Apache.Ignite.Core.Tests.DotNetCore.csproj     | 491 ---------------------
 .../Cache/CacheTest.cs                             |  56 ---
 .../Common/Person.cs                               |  44 --
 .../Common/TestBase.cs                             |  44 --
 .../Common/TestLogger.cs                           |  74 ----
 .../Common/TestRunner.cs                           |  33 --
 .../Common/TestUtils.DotNetCore.cs                 |  99 -----
 .../Properties/AssemblyInfo.cs                     |  52 ---
 .../Apache.Ignite.Core.Tests.DotNetCore/app.config |  44 --
 .../Apache.Ignite.Core.Tests.DotNetCore.csproj     | 111 +++++
 .../Apache.Ignite.Core.Tests.DotNetCore.snk        | Bin
 .../Apache.Ignite.Core.Tests.csproj                |  11 +-
 .../ApiParity/BinaryParityTest.cs                  |   2 +-
 .../ApiParity/CacheAffinityParityTest.cs           |   2 +-
 .../ApiParity/CacheConfigurationParityTest.cs      |   4 +-
 .../ApiParity/CacheMetricsParityTest.cs            |   2 +-
 .../ApiParity/CacheParityTest.cs                   |   2 +-
 .../ClientConnectorConfigurationParityTest.cs      |   2 +-
 .../ApiParity/ClusterMetricsParityTest.cs          |   2 +-
 .../ApiParity/ClusterNodeParityTest.cs             |   4 +-
 .../ApiParity/ClusterParityTest.cs                 |   2 +-
 .../ApiParity/ComputeParityTest.cs                 |   2 +-
 .../ApiParity/DataRegionConfigurationParityTest.cs |   4 +-
 .../ApiParity/DataRegionMetricsParityTest.cs       |   2 +-
 .../DataStorageConfigurationParityTest.cs          |   4 +-
 .../ApiParity/DataStorageMetricsParityTest.cs      |   2 +-
 .../ApiParity/EventsParityTest.cs                  |   2 +-
 .../ApiParity/IgniteConfigurationParityTest.cs     |   4 +-
 .../ApiParity/IgniteParityTest.cs                  |   2 +-
 .../ApiParity/MessagingParityTest.cs               |   2 +-
 .../ApiParity/ParityTest.cs                        |  25 +-
 .../QueryEntityConfigurationParityTest.cs          |   4 +-
 .../ApiParity/ServicesParityTest.cs                |   2 +-
 .../ApiParity/StreamerParityTest.cs                |   2 +-
 .../ApiParity/TcpCommunicationSpiParityTest.cs     |   4 +-
 .../ApiParity/TransactionMetricsParityTest.cs      |   2 +-
 .../ApiParity/TransactionsParityTest.cs            |   2 +-
 .../Binary/BinaryCompactFooterInteropTest.cs       |   4 +-
 .../Binary/BinaryDynamicRegistrationTest.cs        |  34 +-
 .../Binary/BinaryStringTest.cs                     |   2 +
 .../Apache.Ignite.Core.Tests/Binary/EnumsTest.cs   |  23 +-
 .../Binary/EnumsTestOnline.cs                      |   3 +-
 .../Binary/JavaBinaryInteropTest.cs                |   1 +
 .../Serializable/AdvancedSerializationTest.cs      |   2 +
 .../Serializable/BasicSerializableObjectsTest.cs   |   4 +-
 .../Binary/Serializable/CallbacksTest.cs           |   4 +-
 .../Binary/Serializable/DelegatesTest.cs           |   2 +
 .../Binary/Serializable/SqlDmlTest.cs              |  25 +-
 .../Binary/TypeResolverTest.cs                     |  21 +-
 .../Cache/CacheAbstractTest.cs                     |  25 +-
 .../Cache/CacheDynamicStartTest.cs                 |  13 +-
 .../Cache/CacheForkedTest.cs                       |   6 +-
 .../Cache/CacheQueryMetricsTest.cs                 |   1 -
 .../Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs |   3 +-
 .../Cache/NearCacheTest.cs                         |  10 +-
 .../Cache/PartitionLossTest.cs                     |  16 +-
 .../Platform/PlatformCacheTopologyChangeTest.cs    | 134 +++---
 .../Cache/Query/CacheDmlQueriesTest.cs             |  17 +-
 .../Continuous/ContinuousQueryAbstractTest.cs      |  18 +-
 .../Continuous/ContinuousQueryJavaFilterTest.cs    |   1 +
 .../Cache/Query/Linq/CacheLinqTest.Strings.cs      |   2 -
 .../Cache/Store/CacheParallelLoadStoreTest.cs      |   2 +-
 .../Cache/Store/CacheStoreSessionTest.cs           |  10 +-
 .../Store/CacheStoreSessionTestSharedFactory.cs    |   4 +-
 .../Cache/Store/CacheStoreTestCodeConfig.cs        |   9 +-
 .../Client/Cache/CacheTest.cs                      |  10 +-
 .../Client}/Cache/CacheTestAsyncAwait.cs           |   2 +-
 .../Client/Cache/ScanQueryTest.cs                  |  14 +-
 .../Client/ClientConnectionTest.cs                 |  22 +-
 .../Client/ClientTestBase.cs                       |   8 +-
 .../Cluster/ClientClusterDiscoveryTestsBase.cs     |  12 +-
 .../ClientProtocolCompatibilityTest.cs             |  26 +-
 .../ClientReconnectCompatibilityTest.cs            |  10 +-
 .../ClientServerCompatibilityTest.cs               |  48 +-
 .../Client/Compute/ComputeClientTests.cs           |   3 +-
 .../Client/IgniteClientConfigurationTest.cs        |   2 +-
 .../Client/RawSecureSocketTest.cs                  |   4 +
 .../Common/TestFixtureSetUp.cs                     |   0
 .../Common/TestFixtureTearDown.cs                  |   0
 .../Compute/AbstractTaskTest.cs                    |  20 +-
 .../Compute/CancellationTest.cs                    |   4 +-
 .../Compute/ComputeApiTest.JavaTask.cs             |   2 -
 .../Compute/ComputeApiTest.cs                      |  51 ++-
 .../Compute/ComputeMultithreadedTest.cs            |  22 +-
 .../Config/Apache.Ignite.exe.config.test           |   2 +-
 .../Config/Client/server.jks                       | Bin 4256 -> 2392 bytes
 .../Config/Client/thin-client-cert.pfx             | Bin 4549 -> 2717 bytes
 .../Config/Client/trust.jks                        | Bin 1089 -> 1199 bytes
 .../ConsoleRedirectTest.cs                         |  30 +-
 .../Apache.Ignite.Core.Tests/DeploymentTest.cs     |   6 +-
 .../dotnet/Apache.Ignite.Core.Tests/EventsTest.cs  |  48 +-
 .../Apache.Ignite.Core.Tests/Examples/PathUtil.cs  |   4 +-
 .../Apache.Ignite.Core.Tests/ExceptionsTest.cs     |   9 -
 .../Apache.Ignite.Core.Tests/ExecutableTest.cs     |   8 +-
 .../IgniteConfigurationSectionTest.cs              |   8 +-
 .../IgniteConfigurationSerializerTest.cs           |  29 +-
 .../IgniteConfigurationTest.cs                     |  11 +-
 .../Apache.Ignite.Core.Tests/IgniteLockTests.cs    |   4 +-
 .../IgniteStartStopProcessorInitTest.cs            | 113 +++++
 .../IgniteStartStopTest.cs                         |  73 +--
 .../IgnitionStartTest.cs                           |  35 +-
 .../Impl/Compute/ComputeImplTest.cs                |  65 ---
 .../Apache.Ignite.Core.Tests/JavaServer/pom.xml    |   2 +-
 .../Apache.Ignite.Core.Tests/LifecycleTest.cs      |   6 +-
 .../dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs |  24 +-
 .../Log/ConcurrentMemoryTarget.cs                  |   4 +-
 .../Log/DefaultLoggerTest.cs                       |   7 +-
 .../Log/Log4NetLoggerTest.cs                       |   2 +
 .../Apache.Ignite.Core.Tests/Log/NLogLoggerTest.cs |   4 +-
 .../Apache.Ignite.Core.Tests/MarshallerTest.cs     |  12 +-
 .../Apache.Ignite.Core.Tests/MultiAppDomainTest.cs |   6 +-
 .../Process/IgniteProcessConsoleOutputReader.cs    |   5 +
 .../Apache.Ignite.Core.Tests/ReconnectTest.cs      |  35 +-
 .../Services/CallPlatformServiceTest.cs            |  53 +--
 .../Services/ServicesTest.cs                       |   9 +-
 .../dotnet/Apache.Ignite.Core.Tests/TestBase.cs    |   3 +-
 .../dotnet/Apache.Ignite.Core.Tests/TestRunner.cs  |  25 +-
 .../Apache.Ignite.Core.Tests/TestUtils.Windows.cs  | 115 -----
 .../{TestUtils.Common.cs => TestUtils.cs}          | 123 +++++-
 .../Apache.Ignite.Core.Tests/WindowsServiceTest.cs |   2 +
 .../tde.jks                                        | Bin
 .../Apache.Ignite.Core.DotNetCore.csproj           |   8 +
 .../Apache.Ignite.Core/Apache.Ignite.Core.csproj   |   1 +
 .../Apache.Ignite.Core/Impl/Binary/BinaryObject.cs |  10 +-
 .../Apache.Ignite.Core/Impl/Events/Events.cs       |  22 +-
 .../Impl/Unmanaged/Jni/AppDomains.cs               |   6 +-
 .../Impl/Unmanaged/Jni/Callbacks.cs                |   4 +-
 .../Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs   |   4 +-
 .../Impl/Unmanaged/Jni/Jvm.CrossAppDomain.cs       |  95 ++++
 .../Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs   |  71 +--
 .../Impl/Unmanaged/Jni/JvmDll.cs                   |  20 +-
 .../Apache.Ignite.Core/Properties/AssemblyInfo.cs  |   2 +-
 .../platforms/dotnet/Apache.Ignite.DotNetCore.sln  |  12 +-
 .../Apache.Ignite.Linq/Impl/MethodVisitor.cs       |  45 +-
 modules/platforms/dotnet/DEVNOTES.txt              |  30 +-
 modules/platforms/dotnet/README.txt                |  39 --
 modules/platforms/dotnet/build.sh                  |   5 +-
 137 files changed, 1178 insertions(+), 1880 deletions(-)

diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Apache.Ignite.Core.Tests.DotNetCore.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Apache.Ignite.Core.Tests.DotNetCore.csproj
deleted file mode 100644
index 5a6deb1..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Apache.Ignite.Core.Tests.DotNetCore.csproj
+++ /dev/null
@@ -1,491 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
-    <IsPackable>false</IsPackable>
-
-    <StartupObject>Apache.Ignite.Core.Tests.DotNetCore.Common.TestRunner</StartupObject>
-
-    <ApplicationIcon />
-
-    <OutputType>Exe</OutputType>
-  </PropertyGroup>
-
-  <PropertyGroup>
-    <NoWarn>1701;1702;1705;NU1701</NoWarn>
-    <AssemblyOriginatorKeyFile>Apache.Ignite.Core.Tests.DotNetCore.snk</AssemblyOriginatorKeyFile>
-    <SignAssembly>true</SignAssembly>
-    <DelaySign>false</DelaySign>
-  </PropertyGroup>
-
-  <PropertyGroup>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\BinaryParityTest.cs" Link="ApiParity\BinaryParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\CacheAffinityParityTest.cs" Link="ApiParity\CacheAffinityParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\CacheConfigurationParityTest.cs" Link="ApiParity\CacheConfigurationParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\CacheMetricsParityTest.cs" Link="ApiParity\CacheMetricsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\CacheParityTest.cs" Link="ApiParity\CacheParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\ClientConnectorConfigurationParityTest.cs" Link="ApiParity\ClientConnectorConfigurationParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\ClusterMetricsParityTest.cs" Link="ApiParity\ClusterMetricsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\ClusterParityTest.cs" Link="ApiParity\ClusterParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\ComputeParityTest.cs" Link="ApiParity\ComputeParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\DataRegionConfigurationParityTest.cs" Link="ApiParity\DataRegionConfigurationParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\DataRegionMetricsParityTest.cs" Link="ApiParity\DataRegionMetricsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\DataStorageConfigurationParityTest.cs" Link="ApiParity\DataStorageConfigurationParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\DataStorageMetricsParityTest.cs" Link="ApiParity\DataStorageMetricsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\EventsParityTest.cs" Link="ApiParity\EventsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\IgniteConfigurationParityTest.cs" Link="ApiParity\IgniteConfigurationParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\IgniteParityTest.cs" Link="ApiParity\IgniteParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\MessagingParityTest.cs" Link="ApiParity\MessagingParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\ParityTest.cs" Link="ApiParity\ParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\QueryEntityConfigurationParityTest.cs" Link="ApiParity\QueryEntityConfigurationParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\ServicesParityTest.cs" Link="ApiParity\ServicesParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\StreamerParityTest.cs" Link="ApiParity\StreamerParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\TcpCommunicationSpiParityTest.cs" Link="ApiParity\TcpCommunicationSpiParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\TransactionMetricsParityTest.cs" Link="ApiParity\TransactionMetricsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\ApiParity\TransactionsParityTest.cs" Link="ApiParity\TransactionsParityTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\AssertExtensions.cs" Link="Common\AssertExtensions.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\BinaryConfigurationTest.cs" Link="Binary\BinaryConfigurationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryBuilderSelfTest.cs" Link="Binary\BinaryBuilderSelfTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryBuilderSelfTestDynamicRegistration.cs" Link="Binary\BinaryBuilderSelfTestDynamicRegistration.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryDateTimeTest.cs" Link="Binary\BinaryDateTimeTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryEqualityComparerTest.cs">
-      <Link>Binary\BinaryEqualityComparerTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryNameMapperTest.cs">
-      <Link>Binary\BinaryNameMapperTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryReaderWriterTest.cs">
-      <Link>Binary\BinaryReaderWriterTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinarySelfTest.cs" Link="Binary\BinarySelfTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\BinaryStructureTest.cs">
-      <Link>Binary\BinaryStructureTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\EnumsTest.cs" Link="Binary\EnumsTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\EnumsTestOnline.cs" Link="Binary\EnumsTestOnline.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\JavaBinaryInteropTest.cs" Link="Binary\JavaBinaryInteropTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\JavaTypeMappingTest.cs">
-      <Link>Binary\JavaTypeMappingTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\AdvancedSerializationTest.cs" Link="Binary\Serializable\AdvancedSerializationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\CallbacksTest.cs" Link="Binary\Serializable\CallbacksTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\DynamicFieldSetSerializable.cs">
-      <Link>Binary\Serializable\DynamicFieldSetSerializable.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\DynamicFieldSetTest.cs">
-      <Link>Binary\Serializable\DynamicFieldSetTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\GenericCollectionsTest.cs" Link="Binary\Serializable\GenericCollectionsTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\ObjectReferenceTests.cs">
-      <Link>Binary\Serializable\ObjectReferenceTests.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\PrimitivesTest.cs">
-      <Link>Binary\Serializable\PrimitivesTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\Serializable\SqlDmlTest.cs" Link="Binary\Serializable\SqlDmlTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Binary\TypeNameParserTest.cs">
-      <Link>Binary\TypeNameParserTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\AddArgCacheEntryProcessor.cs" Link="Cache\AddArgCacheEntryProcessor.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityAttributeTest.cs">
-      <Link>Cache\Affinity\AffinityAttributeTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityFieldTest.cs">
-      <Link>Cache\Affinity\AffinityFieldTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityFunctionSpringTest.cs">
-      <Link>Cache\Affinity\AffinityFunctionSpringTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityFunctionTest.cs">
-      <Link>Cache\Affinity\AffinityFunctionTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityKeyTest.cs">
-      <Link>Cache\Affinity\AffinityKeyTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityTest.cs">
-      <Link>Cache\Affinity\AffinityTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Affinity\AffinityTopologyVersionTest.cs">
-      <Link>Cache\Affinity\AffinityTopologyVersionTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\BinarizableAddArgCacheEntryProcessor.cs" Link="Cache\BinarizableAddArgCacheEntryProcessor.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\BinarizableTestException.cs" Link="Cache\BinarizableTestException.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CacheAbstractTest.cs" Link="Cache\CacheAbstractTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CacheAbstractTransactionalTest.cs" Link="Cache\CacheAbstractTransactionalTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CacheConfigurationTest.cs" Link="Cache\CacheConfigurationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CacheCreateTest.cs" Link="Cache\CacheCreateTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CachePartitionedTest.cs" Link="Cache\CachePartitionedTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CacheTestAsyncWrapper.cs" Link="Cache\CacheTestAsyncWrapper.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\CacheTestKey.cs" Link="Cache\CacheTestKey.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\DataRegionMetricsTest.cs" Link="Cache\DataRegionMetricsTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\MemoryMetricsTest.cs" Link="Cache\MemoryMetricsTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\NearCacheTest.cs">
-      <Link>Cache\NearCacheTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\NonSerializableCacheEntryProcessor.cs" Link="Cache\NonSerializableCacheEntryProcessor.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\NonSerializableException.cs" Link="Cache\NonSerializableException.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\OptimisticTransactionTest.cs">
-      <Link>Cache\OptimisticTransactionTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\PersistenceTest.cs" Link="Cache\PersistenceTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\FailingCacheStore.cs">
-      <Link>Cache\Platform\FailingCacheStore.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\Foo.cs">
-      <Link>Cache\Platform\Foo.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\PlatformCacheTest.cs">
-      <Link>Cache\Platform\PlatformCacheTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\PlatformCacheTestCreateDestroy.cs">
-      <Link>Cache\Platform\PlatformCacheTestCreateDestroy.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\PlatformCacheTopologyChangeTest.cs">
-      <Link>Cache\Platform\PlatformCacheTopologyChangeTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\ScanQueryNoPlatformCacheFilter.cs">
-      <Link>Cache\Platform\ScanQueryNoPlatformCacheFilter.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\ScanQueryPlatformCacheFilter.cs">
-      <Link>Cache\Platform\ScanQueryPlatformCacheFilter.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Platform\StoreNoPlatformCacheFilter.cs">
-      <Link>Cache\Platform\StoreNoPlatformCacheFilter.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\CacheDmlQueriesTest.cs" Link="Cache\Query\CacheDmlQueriesTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\CacheDmlQueriesTestSimpleName.cs" Link="Cache\Query\CacheDmlQueriesTestSimpleName.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\CacheQueriesCodeConfigurationTest.cs" Link="Cache\Query\CacheQueriesCodeConfigurationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\CacheQueriesTest.cs" Link="Cache\Query\CacheQueriesTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\CacheQueriesTestSimpleName.cs" Link="Cache\Query\CacheQueriesTestSimpleName.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryAbstractTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryAbstractTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryAtomicBackupTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryAtomicBackupTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryAtomicNoBackupTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryAtomicNoBackupTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryJavaFilterTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryJavaFilterTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryNoBackupAbstractTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryNoBackupAbstractTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryTransactionalBackupTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryTransactionalBackupTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Continuous\ContinuousQueryTransactionalNoBackupTest.cs">
-      <Link>Cache\Query\Continuous\ContinuousQueryTransactionalNoBackupTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Aggregates.cs" Link="Cache\Query\Linq\CacheLinqTest.Aggregates.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Base.cs" Link="Cache\Query\Linq\CacheLinqTest.Base.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.CompiledQuery.cs" Link="Cache\Query\Linq\CacheLinqTest.CompiledQuery.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Contains.cs" Link="Cache\Query\Linq\CacheLinqTest.Contains.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Custom.cs" Link="Cache\Query\Linq\CacheLinqTest.Custom.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.DateTime.cs" Link="Cache\Query\Linq\CacheLinqTest.DateTime.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Functions.cs" Link="Cache\Query\Linq\CacheLinqTest.Functions.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Introspection.cs" Link="Cache\Query\Linq\CacheLinqTest.Introspection.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Join.cs" Link="Cache\Query\Linq\CacheLinqTest.Join.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Join.LocalCollection.cs" Link="Cache\Query\Linq\CacheLinqTest.Join.LocalCollection.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Misc.cs" Link="Cache\Query\Linq\CacheLinqTest.Misc.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Numerics.cs" Link="Cache\Query\Linq\CacheLinqTest.Numerics.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTest.Strings.cs" Link="Cache\Query\Linq\CacheLinqTest.Strings.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTestSimpleName.cs" Link="Cache\Query\Linq\CacheLinqTestSimpleName.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Query\Linq\CacheLinqTestSqlEscapeAll.cs" Link="Cache\Query\Linq\CacheLinqTestSqlEscapeAll.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Store\CacheStoreTest.cs">
-      <Link>Cache\Store\CacheStoreTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Store\CacheStoreTestCodeConfig.cs">
-      <Link>Cache\Store\CacheStoreTestCodeConfig.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\Store\CacheTestStore.cs">
-      <Link>Cache\Store\CacheTestStore.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Cache\TestReferenceObject.cs" Link="Cache\TestReferenceObject.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\ContinuousQueryTest.cs">
-      <Link>ThinClient\Cache\ContinuousQueryTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\DynamicFieldSetTest.cs">
-      <Link>ThinClient\Cache\DynamicFieldSetTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\SerializableObjectsTest.cs">
-      <Link>ThinClient\Cache\SerializableObjectsTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\PartitionAwarenessTest.cs">
-      <Link>ThinClient\Cache\PartitionAwarenessTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\BinaryBuilderTest.cs" Link="ThinClient\Cache\BinaryBuilderTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CacheTest.cs" Link="ThinClient\Cache\CacheTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CacheTestAsync.cs" Link="ThinClient\Cache\CacheTestAsync.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CacheClientAsyncWrapper.cs" Link="ThinClient\Cache\CacheClientAsyncWrapper.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CacheTestKeepBinary.cs" Link="ThinClient\Cache\CacheTestKeepBinary.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CacheTestNoMeta.cs">
-      <Link>ThinClient\Cache\CacheTestNoMeta.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CacheTestSsl.cs" Link="ThinClient\Cache\CacheTestSsl.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\ClientCacheConfigurationTest.cs">
-      <Link>ThinClient\Cache\ClientCacheConfigurationTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\CreateCacheTest.cs" Link="ThinClient\Cache\CreateCacheTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\EmptyObject.cs" Link="ThinClient\Cache\EmptyObject.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\ListLogger.cs">
-      <Link>ThinClient\Cache\ListLogger.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\Person.cs" Link="ThinClient\Cache\Person.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\ScanQueryTest.cs" Link="ThinClient\Cache\ScanQueryTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\SqlQueryTestBase.cs" Link="ThinClient\Cache\SqlQueryTestBase.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\SqlQueryTest.cs" Link="ThinClient\Cache\SqlQueryTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\LinqTest.cs" Link="ThinClient\Cache\LinqTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\TestKey.cs">
-      <Link>ThinClient\Cache\TestKey.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cache\TestKeyWithAffinity.cs">
-      <Link>ThinClient\Cache\TestKeyWithAffinity.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientFeaturesTest.cs">
-      <Link>ThinClient\ClientFeaturesTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientProtocolCompatibilityTest.cs">
-      <Link>ThinClient\ClientProtocolCompatibilityTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientConnectionTest.cs" Link="ThinClient\ClientConnectionTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientProtocolVersionTest.cs">
-      <Link>ThinClient\ClientProtocolVersionTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientServerCacheAdapter.cs">
-      <Link>ThinClient\ClientServerCacheAdapter.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientServerCacheAdapterExtensions.cs">
-      <Link>ThinClient\ClientServerCacheAdapterExtensions.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\ClientTestBase.cs" Link="ThinClient\ClientTestBase.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterDiscoveryTests.cs">
-      <Link>ThinClient\Cluster\ClientClusterDiscoveryTests.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterDiscoveryTestsBase.cs">
-      <Link>ThinClient\Cluster\ClientClusterDiscoveryTestsBase.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterDiscoveryTestsBaselineTopology.cs">
-      <Link>ThinClient\Cluster\ClientClusterDiscoveryTestsBaselineTopology.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterDiscoveryTestsNoLocalhost.cs">
-      <Link>ThinClient\Cluster\ClientClusterDiscoveryTestsNoLocalhost.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterDiscoveryTestsSsl.cs">
-      <Link>ThinClient\Cluster\ClientClusterDiscoveryTestsSsl.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterGroupTests.cs" Link="ThinClient\Cluster\ClientClusterGroupTests.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Cluster\ClientClusterTests.cs" Link="ThinClient\Cluster\ClientClusterTests.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Compute\ComputeClientDisabledTests.cs">
-      <Link>ThinClient\Compute\ComputeClientDisabledTests.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\Compute\ComputeClientTests.cs">
-      <Link>ThinClient\Compute\ComputeClientTests.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\EndpointTest.cs" Link="ThinClient\EndpointTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\IgniteClientConfigurationTest.cs" Link="ThinClient\IgniteClientConfigurationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\RawSecureSocketTest.cs" Link="ThinClient\RawSecureSocketTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Client\RawSocketTest.cs">
-      <Link>ThinClient\RawSocketTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Common\IgniteProductVersionTests.cs" Link="Common\IgniteProductVersionTests.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Compute\ComputeApiTest.cs" Link="Compute\ComputeApiTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Compute\ComputeApiTest.JavaTask.cs" Link="Compute\ComputeApiTest.JavaTask.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Compute\ComputeWithExecutorTest.cs" Link="Compute\ComputeWithExecutorTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Dataload\DataStreamerTest.cs">
-      <Link>Dataload\DataStreamerTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Dataload\DataStreamerTestTopologyChange.cs">
-      <Link>Dataload\DataStreamerTestTopologyChange.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\DataStructures\AtomicLongTest.cs" Link="DataStructures\AtomicLongTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\DataStructures\AtomicReferenceTest.cs" Link="DataStructures\AtomicReferenceTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\DataStructures\AtomicSequenceTest.cs" Link="DataStructures\AtomicSequenceTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\DisposeAction.cs">
-      <Link>Common\DisposeAction.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\EventsTestLocalListeners.cs" Link="Common\EventsTestLocalListeners.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\IgniteConfigurationTest.cs" Link="Common\IgniteConfigurationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\IgniteLockFailoverTests.cs">
-      <Link>Common\IgniteLockFailoverTests.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\IgniteLockTests.cs">
-      <Link>Common\IgniteLockTests.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\IgniteUtilsTest.cs">
-      <Link>Common\IgniteUtilsTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Log\ConsoleLoggerTest.cs">
-      <Link>Log\ConsoleLoggerTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Log\FixedDateTimeProvider.cs">
-      <Link>Log\FixedDateTimeProvider.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\PathUtils.cs">
-      <Link>PathUtils.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\ProjectFilesTest.cs">
-      <Link>Common\ProjectFilesTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\TestBase.cs" Link="Common\TestBase.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\SpringTestBase.cs" Link="Common\SpringTestBase.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Log\CustomLoggerTest.cs" Link="Log\CustomLoggerTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\MessagingTest.cs" Link="Common\MessagingTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Plugin\PluginTest.cs" Link="Plugin\PluginTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Plugin\TestIgnitePlugin.cs" Link="Plugin\TestIgnitePlugin.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Plugin\TestIgnitePluginConfiguration.cs" Link="Plugin\TestIgnitePluginConfiguration.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Plugin\TestIgnitePluginException.cs" Link="Plugin\TestIgnitePluginException.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Plugin\TestIgnitePluginProvider.cs" Link="Plugin\TestIgnitePluginProvider.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Query\BinarizablePerson.cs" Link="Cache\Query\BinarizablePerson.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Services\CallPlatformServiceTest.cs" Link="Services\CallPlatformServiceTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Services\ServiceProxyTest.cs" Link="Services\ServiceProxyTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Services\ServicesAsyncWrapper.cs" Link="Services\ServicesAsyncWrapper.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Services\ServicesTest.cs" Link="Services\ServicesTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Services\ServicesTestAsync.cs" Link="Services\ServicesTestAsync.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\TaskExtensions.cs" Link="Common\TaskExtensions.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\TestUtils.Common.cs" Link="Common\TestUtils.Common.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\EnvVar.cs" Link="Common\EnvVar.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Ssl\SslConfigurationTest.cs" Link="Common\SslConfigurationTest.cs" />
-    <Compile Include="..\Apache.Ignite.Core.Tests\Unmanaged\JniThreadDetachTest.cs">
-      <Link>Unmanaged\JniThreadDetachTest.cs</Link>
-    </Compile>
-    <Compile Include="..\Apache.Ignite.Core.Tests\Unmanaged\UnmanagedThreadTest.cs">
-      <Link>Unmanaged\UnmanagedThreadTest.cs</Link>
-    </Compile>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\cache-binarizables.xml" Link="Config\cache-binarizables.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\cache-default.xml" Link="Config\cache-default.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\cache-local-node.xml">
-      <Link>Config\cache-local-node.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\cache-query-continuous.xml">
-      <Link>Config\cache-query-continuous.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\cache-query.xml" Link="Config\cache-query.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Cache\Affinity\affinity-function.xml">
-      <Link>Config\Cache\Affinity\affinity-function.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Cache\Affinity\affinity-function2.xml">
-      <Link>Config\Cache\Affinity\affinity-function2.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Cache\Store\cache-store-session-shared-factory.xml">
-      <Link>Config\Cache\Store\cache-store-session-shared-factory.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Cache\Store\cache-store-session.xml">
-      <Link>Config\Cache\Store\cache-store-session.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Client\IgniteClientConfiguration.xml" Link="Config\Client\IgniteClientConfiguration.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Client\server-with-ssl.xml" Link="Config\Client\server-with-ssl.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Compute\compute-grid1.xml" Link="Config\Compute\compute-grid1.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Compute\compute-grid2.xml" Link="Config\Compute\compute-grid2.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Compute\compute-grid3.xml" Link="Config\Compute\compute-grid3.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\Compute\compute-grid-custom-executor.xml" Link="Config\Compute\compute-grid-custom-executor.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\native-client-test-cache-affinity.xml">
-      <Link>Config\native-client-test-cache-affinity.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\native-client-test-cache-store.xml">
-      <Link>Config\native-client-test-cache-store.xml</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\native-client-test-cache.xml" Link="Config\native-client-test-cache.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\spring-test.xml" Link="Config\spring-test.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\ssl.xml" Link="Config\ssl.xml">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\KeyStore\server.jks" Link="Config\KeyStore\server.jks">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\Apache.Ignite.Core.Tests\Config\KeyStore\trust.jks" Link="Config\KeyStore\trust.jks">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="log4net" Version="2.0.5" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
-    <PackageReference Include="NUnit" Version="3.12.0" />
-    <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
-    <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.4.0" />
-
-	<ProjectReference Include="..\Apache.Ignite.Core\Apache.Ignite.Core.DotNetCore.csproj" />
-	<ProjectReference Include="..\Apache.Ignite.Linq\Apache.Ignite.Linq.DotNetCore.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Folder Include="Binary\Serializable\" />
-    <Folder Include="Cache\Query\Linq\" />
-    <Folder Include="Cache\Query\" />
-    <Folder Include="Compute\" />
-    <Folder Include="Config\Compute\" />
-    <Folder Include="Config\Client\" />
-    <Folder Include="Log\" />
-    <Folder Include="DataStructures\" />
-    <Folder Include="ApiParity\" />
-    <Folder Include="Plugin\" />
-    <Folder Include="Services\" />
-    <Folder Include="ThinClient\Cache\" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="..\Apache.Ignite.Core.Tests\Config\Client\server.jks" Link="Config\Client\server.jks">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="..\Apache.Ignite.Core.Tests\Config\Client\thin-client-cert.pfx" Link="Config\Client\thin-client-cert.pfx">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="..\Apache.Ignite.Core.Tests\Config\Client\trust.jks" Link="Config\Client\trust.jks">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="..\Apache.Ignite.Core.Tests\custom_app.config" Link="custom_app.config">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="Common\TestUtils.DotNetCore.cs" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Update="app.config">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-  </ItemGroup>
-
-</Project>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Cache/CacheTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Cache/CacheTest.cs
deleted file mode 100644
index 701c839..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Cache/CacheTest.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests.DotNetCore.Cache
-{
-    using System.Threading.Tasks;
-    using Apache.Ignite.Core.Cache;
-    using Apache.Ignite.Core.Tests.DotNetCore.Common;
-    using NUnit.Framework;
-
-    /// <summary>
-    /// Cache tests.
-    /// </summary>
-    public class CacheTest : TestBase
-    {
-        /// <summary>
-        /// Tests the put / get functionality.
-        /// </summary>
-        [Test]
-        public void TestPutGet()
-        {
-            async Task PutGetAsync(ICache<int, Person> cache)
-            {
-                await cache.PutAsync(2, new Person("Bar", 2));
-                var res = await cache.GetAsync(2);
-                Assert.AreEqual(2, res.Id);
-            }
-
-            using (var ignite = Start())
-            {
-                var cache = ignite.CreateCache<int, Person>("persons");
-
-                // Sync.
-                cache[1] = new Person("Foo", 1);
-                Assert.AreEqual("Foo", cache[1].Name);
-
-                // Async.
-                PutGetAsync(cache).Wait();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/Person.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/Person.cs
deleted file mode 100644
index 933ed26..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/Person.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests.DotNetCore.Common
-{
-    /// <summary>
-    /// Test person.
-    /// </summary>
-    public class Person
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="Person"/> class.
-        /// </summary>
-        public Person(string name, int id)
-        {
-            Name = name;
-            Id = id;
-        }
-
-        /// <summary>
-        /// Gets or sets the name.
-        /// </summary>
-        public string Name { get; set; }
-
-        /// <summary>
-        /// Gets or sets the identifier.
-        /// </summary>
-        public int Id { get; set; }
-    }
-}
\ No newline at end of file
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestBase.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestBase.cs
deleted file mode 100644
index 4e77c0d..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestBase.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests.DotNetCore.Common
-{
-    using NUnit.Framework;
-
-    /// <summary>
-    /// Base test class.
-    /// </summary>
-    public class TestBase
-    {
-        /// <summary>
-        /// Fixture cleanup.
-        /// </summary>
-        [OneTimeTearDown]
-        public static void ClassCleanup()
-        {
-            Ignition.StopAll(true);
-        }
-
-        /// <summary>
-        /// Starts Ignite.
-        /// </summary>
-        public IIgnite Start(string name = null)
-        {
-            return Ignition.Start(TestUtils.GetTestConfiguration(name));
-        }
-    }
-}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestLogger.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestLogger.cs
deleted file mode 100644
index 8253fb8..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestLogger.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests.DotNetCore.Common
-{
-    using System;
-    using System.Diagnostics;
-    using System.Globalization;
-    using System.IO;
-    using Apache.Ignite.Core.Log;
-
-    /// <summary>
-    /// 'dotnet test' swallows console output. This logger writes to a file to overcome this.
-    /// </summary>
-    internal class TestLogger : ILogger
-    {
-        /** */
-        public static readonly TestLogger Instance = new TestLogger();
-
-        /** */
-        private readonly StreamWriter _file;
-
-        /// <summary>
-        /// Prevents a default instance of the <see cref="TestLogger"/> class from being created.
-        /// </summary>
-        private TestLogger()
-        {
-            var binDir = Path.GetDirectoryName(GetType().Assembly.Location);
-            var file = Path.Combine(binDir, "dotnet-test.log");
-
-            if (File.Exists(file))
-            {
-                File.Delete(file);
-            }
-
-            _file = File.AppendText(file);
-        }
-
-        /** <inheritdoc /> */
-        public void Log(LogLevel level, string message, object[] args, IFormatProvider formatProvider, string category,
-            string nativeErrorInfo, Exception ex)
-        {
-            lock (_file)
-            {
-                var text = args != null
-                    ? string.Format(formatProvider ?? CultureInfo.InvariantCulture, message, args)
-                    : message;
-
-                _file.WriteLine(text);
-                _file.Flush();
-            }
-        }
-
-        /** <inheritdoc /> */
-        public bool IsEnabled(LogLevel level)
-        {
-            return level > LogLevel.Debug;
-        }
-    }
-}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestRunner.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestRunner.cs
deleted file mode 100644
index 85bbda7..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestRunner.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests.DotNetCore.Common
-{
-    /// <summary>
-    /// Test runner.
-    /// </summary>
-    internal class TestRunner
-    {
-        /// <summary>
-        /// Console entry point.
-        /// </summary>
-        private static void Main(string[] args)
-        {
-            new IgnitionStartTest().TestIgniteStartsFromAppConfig();
-        }
-    }
-}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestUtils.DotNetCore.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestUtils.DotNetCore.cs
deleted file mode 100644
index b38dca7..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestUtils.DotNetCore.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests
-{
-    using System;
-    using System.Diagnostics;
-    using System.IO;
-    using System.Linq;
-    using Apache.Ignite.Core.Failure;
-    using Apache.Ignite.Core.Log;
-    using Apache.Ignite.Core.Tests.DotNetCore.Common;
-
-    public static partial class TestUtils
-    {
-        /// <summary>
-        /// Gets the default code-based test configuration.
-        /// </summary>
-        public static IgniteConfiguration GetTestConfiguration(string name = null)
-        {
-            TestLogger.Instance.Info("GetTestConfiguration: " + GetTestName());
-
-            Environment.SetEnvironmentVariable("IGNITE_NATIVE_TEST_CLASSPATH", "true");
-            Environment.SetEnvironmentVariable("IGNITE_NET_SUPPRESS_JAVA_ILLEGAL_ACCESS_WARNINGS", "true");
-
-            return new IgniteConfiguration
-            {
-                DiscoverySpi = GetStaticDiscovery(),
-                Localhost = "127.0.0.1",
-                JvmOptions = TestJavaOptions(),
-                IgniteInstanceName = name,
-                Logger = TestLogger.Instance,
-                WorkDirectory = WorkDir,
-                FailureHandler = new NoOpFailureHandler()
-            };
-        }
-
-        /// <summary>
-        /// Gets the name of the test.
-        /// </summary>
-        private static string GetTestName()
-        {
-            var st = new StackTrace();
-
-            for (var i = 0; i < st.FrameCount; i++)
-            {
-                var frame = st.GetFrame(i);
-                var method = frame.GetMethod();
-
-                if (method.DeclaringType != typeof(TestUtils) 
-                    && method.DeclaringType != typeof(TestBase))
-                {
-                    return $"{method.DeclaringType.Name}.{method.Name}";
-                }
-            }
-
-            return st.GetFrames().Skip(2).Select(x => x.ToString()).FirstOrDefault() ?? "unknown";
-        }
-
-        /// <summary>
-        /// Creates a uniquely named, empty temporary directory on disk and returns the full path of that directory.
-        /// </summary>
-        /// <returns>The full path of the temporary directory.</returns>
-        internal static string GetTempDirectoryName()
-        {
-            var baseDir = Path.Combine(Path.GetTempPath(), "IgniteTemp_");
-
-            while (true)
-            {
-                try
-                {
-                    return Directory.CreateDirectory(baseDir + Path.GetRandomFileName()).FullName;
-                }
-                catch (IOException)
-                {
-                    // Expected
-                }
-                catch (UnauthorizedAccessException)
-                {
-                    // Expected
-                }
-            }
-        }
-    }
-}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Properties/AssemblyInfo.cs
deleted file mode 100644
index 29dba26..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-* 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.
-*/
-
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Apache.Ignite.Core.Tests.DotNetCore.Properties")]
-[assembly: AssemblyDescription("Apache Ignite.NET Core Tests")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Apache Software Foundation")]
-[assembly: AssemblyProduct("Apache Ignite.NET")]
-[assembly: AssemblyCopyright("Copyright 2020")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-#if NETCOREAPP2_0
-//[assembly: AssemblyKeyFile("Apache.Ignite.Core.Tests.DotNetCore.snk")]
-#endif
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("27f92be8-0fde-4996-8d8d-0453d77e1484")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-[assembly: AssemblyVersion("2.10.0.47753")]
-[assembly: AssemblyFileVersion("2.10.0.47753")]
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/app.config b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/app.config
deleted file mode 100644
index f750305..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/app.config
+++ /dev/null
@@ -1,44 +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.
--->
-
-<configuration>
-
-  <configSections>
-    <section name="igniteConfiguration" type="Apache.Ignite.Core.IgniteConfigurationSection, Apache.Ignite.Core" />
-  </configSections>
-
-  <runtime>
-    <gcServer enabled="true" />
-  </runtime>
-
-  <igniteConfiguration xmlns="http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection"
-                       localhost="127.0.0.1">
-    <cacheConfiguration>
-      <cacheConfiguration name="cacheFromConfig" cacheMode="Replicated" />
-    </cacheConfiguration>
-
-    <discoverySpi type="TcpDiscoverySpi">
-      <ipFinder type="TcpDiscoveryMulticastIpFinder">
-        <endpoints>
-          <string>127.0.0.1:47500</string>
-        </endpoints>
-      </ipFinder>
-    </discoverySpi>
-  </igniteConfiguration>
-</configuration>
\ No newline at end of file
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.DotNetCore.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.DotNetCore.csproj
new file mode 100644
index 0000000..54d2f61
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.DotNetCore.csproj
@@ -0,0 +1,111 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <IsPackable>false</IsPackable>
+
+    <StartupObject>Apache.Ignite.Core.Tests.TestRunner</StartupObject>
+
+    <ApplicationIcon />
+
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Apache.Ignite.Core.Tests</RootNamespace>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <NoWarn>1701;1702;1705;NU1701</NoWarn>
+    <AssemblyOriginatorKeyFile>Apache.Ignite.Core.Tests.DotNetCore.snk</AssemblyOriginatorKeyFile>
+    <SignAssembly>true</SignAssembly>
+    <DelaySign>false</DelaySign>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="log4net" Version="2.0.5" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
+    <PackageReference Include="NUnit" Version="3.12.0" />
+    <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
+    <PackageReference Include="System.CodeDom" Version="4.5.0" />
+    <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.4.0" />
+    <ProjectReference Include="..\Apache.Ignite.Core\Apache.Ignite.Core.DotNetCore.csproj" />
+    <ProjectReference Include="..\Apache.Ignite.Linq\Apache.Ignite.Linq.DotNetCore.csproj" />
+    <ProjectReference Include="..\Apache.Ignite\Apache.Ignite.DotNetCore.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Update="app.config">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Remove="Deployment\**" />
+    <None Remove="Examples\**" />
+
+    <None Update="Config\ignite-halthandler-dotnet-cfg.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\native-client-test-cache-affinity.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\marshaller-explicit.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\native-client-test-cache-parallel-store.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\ssl.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Apache.Ignite.exe.config.test3" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\full-config.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Apache.Ignite.exe.config.test" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\spring-test.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\cache-local-node.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\ignite-dotnet-cfg.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\ignite-stophandler-dotnet-cfg.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\cache-default.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\native-client-test-cache-store.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\cache-query.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\marshaller-invalid.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\cache-query-continuous.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\ignite-dotnet-cfg-logger.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\cache-binarizables.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\reconnect-test.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\native-client-test-cache.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\marshaller-default.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Apache.Ignite.exe.config.test2" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Log\dotnet-log4j.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Log\custom-log.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\KeyStore\server.jks" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\KeyStore\trust.jks" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Lifecycle\lifecycle-beans.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Lifecycle\lifecycle-no-beans.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Client\server-with-ssl.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Client\server.jks" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Client\thin-client-cert.pfx" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Client\IgniteClientConfiguration.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Client\trust.jks" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Compute\compute-grid1.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Compute\compute-grid-custom-executor.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Compute\compute-standalone.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Compute\compute-grid2.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Compute\compute-grid3.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Dynamic\dynamic-data-no-cfg.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Dynamic\dynamic-client.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Dynamic\dynamic-data.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Cache\Store\cache-store-session.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Cache\Store\cache-store-session-shared-factory.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Cache\Affinity\affinity-function.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="Config\Cache\Affinity\affinity-function2.xml" CopyToOutputDirectory="PreserveNewest" />
+    <None Update="custom_app.config">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Remove="Compute\Forked\**" />
+
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Remove="Deployment\**" />
+    <Compile Remove="Examples\**" />
+    <Compile Remove="Compute\Forked\**" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Remove="Deployment\**" />
+    <EmbeddedResource Remove="Examples\**" />
+    <EmbeddedResource Remove="Compute\Forked\**" />
+  </ItemGroup>
+
+</Project>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Apache.Ignite.Core.Tests.DotNetCore.snk b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.DotNetCore.snk
similarity index 100%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Apache.Ignite.Core.Tests.DotNetCore.snk
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.DotNetCore.snk
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
index 3184d4c..c92cd0a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
@@ -166,13 +166,10 @@
     <Compile Include="Client\Cache\SqlQueryTestBase.cs" />
     <Compile Include="Client\Cache\TestKey.cs" />
     <Compile Include="Client\Cache\TestKeyWithAffinity.cs" />
-    <Compile Include="Client\ClientProtocolCompatibilityTest.cs" />
     <Compile Include="Client\ClientFeaturesTest.cs" />
     <Compile Include="Client\ClientProtocolVersionTest.cs" />
-    <Compile Include="Client\ClientReconnectCompatibilityTest.cs" />
     <Compile Include="Client\ClientServerCacheAdapter.cs" />
     <Compile Include="Client\ClientServerCacheAdapterExtensions.cs" />
-    <Compile Include="Client\ClientServerCompatibilityTest.cs" />
     <Compile Include="Client\ClientTestBase.cs" />
     <Compile Include="Client\Cluster\ClientClusterDiscoveryTests.cs" />
     <Compile Include="Client\Cluster\ClientClusterDiscoveryTestsBase.cs" />
@@ -181,6 +178,9 @@
     <Compile Include="Client\Cluster\ClientClusterDiscoveryTestsSsl.cs" />
     <Compile Include="Client\Cluster\ClientClusterGroupTests.cs" />
     <Compile Include="Client\Cluster\ClientClusterTests.cs" />
+    <Compile Include="Client\Compatibility\ClientProtocolCompatibilityTest.cs" />
+    <Compile Include="Client\Compatibility\ClientReconnectCompatibilityTest.cs" />
+    <Compile Include="Client\Compatibility\ClientServerCompatibilityTest.cs" />
     <Compile Include="Client\Compute\ComputeClientDisabledTests.cs" />
     <Compile Include="Client\Compute\ComputeClientTests.cs" />
     <Compile Include="Client\EndpointTest.cs" />
@@ -243,8 +243,8 @@
     <Compile Include="FailureHandlerTest.cs" />
     <Compile Include="IgniteLockFailoverTests.cs" />
     <Compile Include="IgniteLockTests.cs" />
+    <Compile Include="IgniteStartStopProcessorInitTest.cs" />
     <Compile Include="IgniteUtilsTest.cs" />
-    <Compile Include="Impl\Compute\ComputeImplTest.cs" />
     <Compile Include="JavaServer.cs" />
     <Compile Include="Log\ConsoleLoggerTest.cs" />
     <Compile Include="Log\FixedDateTimeProvider.cs" />
@@ -359,7 +359,6 @@
     <Compile Include="IgniteStartStopTest.cs" />
     <Compile Include="Services\ServicesTestFullFooter.cs" />
     <Compile Include="TestBase.cs" />
-    <Compile Include="TestUtils.Common.cs" />
     <Compile Include="Memory\InteropMemoryTest.cs" />
     <Compile Include="Binary\BinaryBuilderSelfTest.cs" />
     <Compile Include="Binary\BinarySelfTest.cs" />
@@ -376,6 +375,7 @@
     <Compile Include="Services\ServiceProxyTest.cs" />
     <Compile Include="Services\ServicesAsyncWrapper.cs" />
     <Compile Include="TestRunner.cs" />
+    <Compile Include="TestUtils.cs" />
     <Compile Include="Unmanaged\JniThreadDetachTest.cs" />
     <Compile Include="Unmanaged\UnmanagedThreadTest.cs" />
     <Compile Include="WindowsServiceTest.cs" />
@@ -575,7 +575,6 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <None Include="packages.config" />
-    <Compile Include="TestUtils.Windows.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="AfterBuild">
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/BinaryParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/BinaryParityTest.cs
index 187fc2a..3566888 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/BinaryParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/BinaryParityTest.cs
@@ -24,7 +24,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IBinary"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class BinaryParityTest
     {
         /** Known name mappings. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheAffinityParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheAffinityParityTest.cs
index f232bbe..6685921 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheAffinityParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheAffinityParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="ICacheAffinity"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class CacheAffinityParityTest
     {
         /// <summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheConfigurationParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheConfigurationParityTest.cs
index 9665b97..21aea62 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheConfigurationParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheConfigurationParityTest.cs
@@ -24,7 +24,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="CacheConfiguration"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class CacheConfigurationParityTest
     {
         /** Known property name mappings. */
@@ -73,7 +73,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public void TestCacheConfiguration()
         {
             ParityTest.CheckConfigurationParity(
-                @"modules\core\src\main\java\org\apache\ignite\configuration\CacheConfiguration.java", 
+                @"modules\core\src\main\java\org\apache\ignite\configuration\CacheConfiguration.java",
                 typeof(CacheConfiguration),
                 UnneededProperties,
                 MissingProperties,
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheMetricsParityTest.cs
index 3771003..e724a79 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheMetricsParityTest.cs
@@ -24,7 +24,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="ICacheMetrics"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class CacheMetricsParityTest
     {
         /** Known name mappings. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheParityTest.cs
index 306d906..8dacc34 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/CacheParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="ICache{TK,TV}"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class CacheParityTest
     {
         /** Members that are not needed on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClientConnectorConfigurationParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClientConnectorConfigurationParityTest.cs
index efd916b..c506271 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClientConnectorConfigurationParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClientConnectorConfigurationParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="ClientConnectorConfiguration"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class ClientConnectorConfigurationParityTest
     {
         /** Members that are missing on .NET side and should be added in future. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs
index e69ec9a..3a1f3bf 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IClusterMetrics"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class ClusterMetricsParityTest
     {
         /** Properties that are missing on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterNodeParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterNodeParityTest.cs
index ffcf37c..9f07a53 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterNodeParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterNodeParityTest.cs
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
- 
+
  namespace Apache.Ignite.Core.Tests.ApiParity
 {
     using Apache.Ignite.Core.Cluster;
@@ -23,7 +23,7 @@
     /// <summary>
     /// Tests that <see cref="IClusterNode"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class ClusterNodeParityTest
     {
         /** Members that are missing on .NET side and should be added in future. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterParityTest.cs
index b1f52c8..c101242 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterParityTest.cs
@@ -23,7 +23,7 @@
     /// <summary>
     /// Tests that <see cref="ICluster"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class ClusterParityTest
     {
         /** Members that are not needed on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ComputeParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ComputeParityTest.cs
index a1e4f94..56dfa78 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ComputeParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ComputeParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="ICompute"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class ComputeParityTest
     {
         /** Methods that are not needed on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionConfigurationParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionConfigurationParityTest.cs
index 9fba6aa..063b9f0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionConfigurationParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionConfigurationParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="DataRegionConfiguration"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class DataRegionConfigurationParityTest
     {
         /// <summary>
@@ -33,7 +33,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public void TestRegionConfiguration()
         {
             ParityTest.CheckConfigurationParity(
-                @"modules\core\src\main\java\org\apache\ignite\configuration\DataRegionConfiguration.java", 
+                @"modules\core\src\main\java\org\apache\ignite\configuration\DataRegionConfiguration.java",
                 typeof(DataRegionConfiguration));
         }
     }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
index a6855fb..fa4c208 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IDataRegionMetrics"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class DataRegionMetricsParityTest
     {
         /** Known name mappings. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageConfigurationParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageConfigurationParityTest.cs
index ef4f996..25443e5 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageConfigurationParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageConfigurationParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="DataStorageConfiguration"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class DataStorageConfigurationParityTest
     {
         /** Properties that are not needed on .NET side. */
@@ -48,7 +48,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public void TestStorageConfiguration()
         {
             ParityTest.CheckConfigurationParity(
-                @"modules\core\src\main\java\org\apache\ignite\configuration\DataStorageConfiguration.java", 
+                @"modules\core\src\main\java\org\apache\ignite\configuration\DataStorageConfiguration.java",
                 typeof(DataStorageConfiguration),
                 UnneededProperties, MissingProperties);
         }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
index b8ed1e7..92ffddf 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
@@ -22,7 +22,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IDataStorageMetrics"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class DataStorageMetricsParityTest
     {
         /** Properties that are missing on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/EventsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/EventsParityTest.cs
index 12ada50..a79fc93 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/EventsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/EventsParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IEvents"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class EventsParityTest
     {
         /** Members that are missing on .NET side and should be added in future. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteConfigurationParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteConfigurationParityTest.cs
index 50686f9..9377e20 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteConfigurationParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteConfigurationParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="IgniteConfiguration"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class IgniteConfigurationParityTest
     {
         /** Known property name mappings Java -> .NET. */
@@ -100,7 +100,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public void TestIgniteConfiguration()
         {
             ParityTest.CheckConfigurationParity(
-                @"modules\core\src\main\java\org\apache\ignite\configuration\IgniteConfiguration.java", 
+                @"modules\core\src\main\java\org\apache\ignite\configuration\IgniteConfiguration.java",
                 typeof(IgniteConfiguration),
                 UnneededProperties,
                 MissingProperties,
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteParityTest.cs
index 25f123b..f37cc56 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/IgniteParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IIgnite"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class IgniteParityTest
     {
         /** Methods that are not needed on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/MessagingParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/MessagingParityTest.cs
index 550fe00..646b279 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/MessagingParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/MessagingParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IMessaging"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class MessagingParityTest
     {
         /// <summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ParityTest.cs
index b339a86..478360f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ParityTest.cs
@@ -36,11 +36,11 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public const string IgnoreReason = "API parity tests are supposed to be run manually.";
 
         /** Property regex. */
-        private static readonly Regex JavaPropertyRegex = 
+        private static readonly Regex JavaPropertyRegex =
             new Regex("(@Deprecated)?\\s+public [^=^\r^\n]+ (\\w+)\\(\\) {", RegexOptions.Compiled);
 
         /** Interface method regex. */
-        private static readonly Regex JavaInterfaceMethodRegex = 
+        private static readonly Regex JavaInterfaceMethodRegex =
             new Regex("(@Deprecated)?\\s+(@Override)?\\s+public [^=^\r^\n]+ (\\w+)\\(.*?\\)",
                 RegexOptions.Compiled | RegexOptions.Singleline);
 
@@ -55,8 +55,8 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         /// <summary>
         /// Tests the configuration parity.
         /// </summary>
-        public static void CheckConfigurationParity(string javaFilePath, 
-            Type type, 
+        public static void CheckConfigurationParity(string javaFilePath,
+            Type type,
             IEnumerable<string> excludedProperties = null,
             IEnumerable<string> knownMissingProperties = null,
             Dictionary<string, string> knownMappings = null)
@@ -75,8 +75,8 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         /// <summary>
         /// Tests the configuration parity.
         /// </summary>
-        public static void CheckInterfaceParity(string javaFilePath, 
-            Type type, 
+        public static void CheckInterfaceParity(string javaFilePath,
+            Type type,
             IEnumerable<string> excludedMembers = null,
             IEnumerable<string> knownMissingMembers = null,
             Dictionary<string, string> knownMappings = null)
@@ -133,8 +133,8 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         /// <summary>
         /// Checks the parity.
         /// </summary>
-        private static void CheckParity(Type type, IEnumerable<string> knownMissingMembers, 
-            IDictionary<string, string> knownMappings, IEnumerable<string> javaMethods, 
+        private static void CheckParity(Type type, IEnumerable<string> knownMissingMembers,
+            IDictionary<string, string> knownMappings, IEnumerable<string> javaMethods,
             IDictionary<string, MemberInfo> dotNetMembers)
         {
             var missingMembers = javaMethods
@@ -181,6 +181,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         {
             var text = File.ReadAllText(path);
 
+            // ReSharper disable once RedundantEnumerableCastCall
             return JavaPropertyRegex.Matches(text)
                 .OfType<Match>()
                 .Where(m => m.Groups[1].Value == string.Empty)
@@ -196,6 +197,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         {
             var text = File.ReadAllText(path);
 
+            // ReSharper disable once RedundantEnumerableCastCall
             return JavaInterfaceMethodRegex.Matches(text)
                 .OfType<Match>()
                 .Where(m => m.Groups[1].Value == string.Empty)
@@ -206,13 +208,13 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         /// <summary>
         /// Gets the name variants for a property.
         /// </summary>
-        private static IEnumerable<string> GetNameVariants(string javaPropertyName, 
+        private static IEnumerable<string> GetNameVariants(string javaPropertyName,
             IDictionary<string, string> knownMappings)
         {
             yield return javaPropertyName;
-            
+
             yield return "get" + javaPropertyName;
-            
+
             yield return "is" + javaPropertyName;
 
             yield return javaPropertyName.Replace("PoolSize", "ThreadPoolSize");
@@ -223,7 +225,6 @@ namespace Apache.Ignite.Core.Tests.ApiParity
             }
 
             string map;
-
             if (knownMappings != null && knownMappings.TryGetValue(javaPropertyName, out map))
             {
                 yield return map;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/QueryEntityConfigurationParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/QueryEntityConfigurationParityTest.cs
index f832923..14e44b7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/QueryEntityConfigurationParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/QueryEntityConfigurationParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="QueryEntity"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class QueryEntityConfigurationParityTest
     {
         /** Properties that are not needed on .NET side. */
@@ -45,7 +45,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public void TestQueryEntityConfiguration()
         {
             ParityTest.CheckConfigurationParity(
-                @"modules\core\src\main\java\org\apache\ignite\cache\QueryEntity.java", 
+                @"modules\core\src\main\java\org\apache\ignite\cache\QueryEntity.java",
                 typeof(QueryEntity),
                 UnneededProperties);
         }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ServicesParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ServicesParityTest.cs
index 44ae2c6..e30be57 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ServicesParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ServicesParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IServices"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class ServicesParityTest
     {
         /// <summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/StreamerParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/StreamerParityTest.cs
index 9bca0cc..634079a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/StreamerParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/StreamerParityTest.cs
@@ -24,7 +24,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="IDataStreamer{TK,TV}"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class StreamerParityTest
     {
         /** Members that are not needed on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TcpCommunicationSpiParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TcpCommunicationSpiParityTest.cs
index e82daa8..f6cea81 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TcpCommunicationSpiParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TcpCommunicationSpiParityTest.cs
@@ -25,7 +25,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that .NET <see cref="CacheConfiguration"/> has all properties from Java configuration APIs.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class TcpCommunicationSpiParityTest
     {
         /** Known property name mappings. */
@@ -75,7 +75,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         public void TestTcpCommunicationSpi()
         {
             ParityTest.CheckConfigurationParity(
-                @"modules\core\src\main\java\org\apache\ignite\spi\communication\tcp\TcpCommunicationSpi.java", 
+                @"modules\core\src\main\java\org\apache\ignite\spi\communication\tcp\TcpCommunicationSpi.java",
                 typeof(TcpCommunicationSpi),
                 UnneededProperties,
                 MissingProperties,
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionMetricsParityTest.cs
index 6a8b820..ad93305 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionMetricsParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="ITransactionMetrics"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class TransactionMetricsParityTest
     {
             /** Properties that are missing on .NET side. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionsParityTest.cs
index c822755..40a7ffed 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/TransactionsParityTest.cs
@@ -23,7 +23,7 @@ namespace Apache.Ignite.Core.Tests.ApiParity
     /// <summary>
     /// Tests that <see cref="ITransactions"/> has all APIs from Java Ignite interface.
     /// </summary>
-    [Ignore(ParityTest.IgnoreReason)]
+    [Explicit(ParityTest.IgnoreReason)]
     public class TransactionsParityTest
     {
         /** Members that are missing on .NET side and should be added in future. */
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
index e76811f..913599e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
@@ -44,8 +44,8 @@ namespace Apache.Ignite.Core.Tests.Binary
         public void TestSetUp()
         {
             // Start fresh cluster for each test
-            _grid = Ignition.Start(Config("config\\compute\\compute-grid1.xml"));
-            _clientGrid = Ignition.Start(Config("config\\compute\\compute-grid3.xml"));
+            _grid = Ignition.Start(Config("Config\\Compute\\compute-grid1.xml"));
+            _clientGrid = Ignition.Start(Config("Config\\Compute\\compute-grid3.xml"));
         }
 
         /// <summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
index 1628f12..455c1a9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
@@ -18,7 +18,11 @@
 // ReSharper disable UnusedAutoPropertyAccessor.Local
 namespace Apache.Ignite.Core.Tests.Binary
 {
+#if !NETCOREAPP
     extern alias ExamplesDll;
+    using Apache.Ignite.ExamplesDll.Binary;
+    using ExamplesAccount = ExamplesDll::Apache.Ignite.ExamplesDll.Binary.Account;
+#endif
 
     using System;
     using System.Collections;
@@ -35,11 +39,8 @@ namespace Apache.Ignite.Core.Tests.Binary
     using Apache.Ignite.Core.Impl.Binary;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Tests.Compute;
-    using Apache.Ignite.ExamplesDll.Binary;
     using NUnit.Framework;
 
-    using ExamplesAccount = ExamplesDll::Apache.Ignite.ExamplesDll.Binary.Account;
-
     /// <summary>
     /// Tests the dynamic type registration.
     /// </summary>
@@ -297,7 +298,7 @@ namespace Apache.Ignite.Core.Tests.Binary
         }
 
         /// <summary>
-        /// Tests interop scenario: Java and .NET exchange an object with the same type id, 
+        /// Tests interop scenario: Java and .NET exchange an object with the same type id,
         /// but marshaller cache contains different entries for different platforms for the same id.
         /// </summary>
         [Test]
@@ -339,6 +340,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             }
         }
 
+#if !NETCOREAPP
         /// <summary>
         /// Tests that types with same FullName from different assemblies are mapped to each other.
         /// </summary>
@@ -360,6 +362,7 @@ namespace Apache.Ignite.Core.Tests.Binary
                 }
             }
         }
+#endif
 
         /// <summary>
         /// Tests registration in multiple threads.
@@ -376,7 +379,7 @@ namespace Apache.Ignite.Core.Tests.Binary
                 var bin = ignite.GetBinary();
                 Func<Type, IBinaryObjectBuilder> getBuilder = x =>
                     useTypeName ? bin.GetBuilder(x.FullName) : bin.GetBuilder(x);
-                    
+
                 var types = new[] { typeof(Foo), typeof(Bar), typeof(Bin) };
 
                 foreach (var type in types)
@@ -444,12 +447,17 @@ namespace Apache.Ignite.Core.Tests.Binary
             // Test compute.
             var serverNodeCount = ignite1.GetCluster().ForServers().GetNodes().Count;
 
-            var res = ignite1.GetCompute().Broadcast(new CompFn<DateTime>(() => DateTime.Now));
-            Assert.AreEqual(serverNodeCount, res.Count);
+            var res0 = ignite1.GetCompute().Broadcast(new CompDateTimeFn());
+            Assert.AreEqual(serverNodeCount, res0.Count);
+
+#if !NETCOREAPP // Serializing delegates is not supported on this platform
+            var res1 = ignite1.GetCompute().Broadcast(new CompFn<DateTime>(() => DateTime.Now));
+            Assert.AreEqual(serverNodeCount, res1.Count);
 
             // Variable capture.
             var res2 = ignite1.GetCompute().Broadcast(new CompFn<string>(() => bar0.Str));
             Assert.AreEqual(Enumerable.Repeat(bar0.Str, serverNodeCount), res2);
+#endif
         }
 
         /// <summary>
@@ -560,6 +568,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             }
         }
 
+#if !NETCOREAPP // Serializing delegates is not supported on this platform
         private class CompFn<T> : IComputeFunc<T>
         {
             private readonly Func<T> _func;
@@ -574,9 +583,19 @@ namespace Apache.Ignite.Core.Tests.Binary
                 return _func();
             }
         }
+#endif
+
+        private class CompDateTimeFn : IComputeFunc<DateTime>
+        {
+            public DateTime Invoke()
+            {
+                return DateTime.UtcNow;
+            }
+        }
     }
 }
 
+#if !NETCOREAPP
 namespace Apache.Ignite.ExamplesDll.Binary
 {
     /// <summary>
@@ -589,3 +608,4 @@ namespace Apache.Ignite.ExamplesDll.Binary
         public decimal Balance { get; set; }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryStringTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryStringTest.cs
index 8b9a7bc..6a53b0f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryStringTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryStringTest.cs
@@ -75,6 +75,7 @@ namespace Apache.Ignite.Core.Tests.Binary
                 Assert.AreEqual(test, res);
         }
 
+#if !NETCOREAPP
         /// <summary>
         /// Tests the old serialization mode.
         /// </summary>
@@ -87,5 +88,6 @@ namespace Apache.Ignite.Core.Tests.Binary
                 TestUtils.RunTestInNewProcess(GetType().FullName, "TestOldMode");
             }
         }
+#endif
     }
 }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTest.cs
index 8993fb4..63ee9c1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+// ReSharper disable NonReadonlyMemberInGetHashCode
 namespace Apache.Ignite.Core.Tests.Binary
 {
     using System;
@@ -44,19 +45,19 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             CheckValue(ShortEnum.Foo);
             CheckValue(ShortEnum.Bar);
-            
+
             CheckValue(UShortEnum.Foo);
             CheckValue(UShortEnum.Bar);
-            
+
             CheckValue(IntEnum.Foo);
             CheckValue(IntEnum.Bar);
-            
+
             CheckValue(UIntEnum.Foo);
             CheckValue(UIntEnum.Bar);
 
             CheckValue(LongEnum.Foo, false);
             CheckValue(LongEnum.Bar, false);
-            
+
             CheckValue(ULongEnum.Foo, false);
             CheckValue(ULongEnum.Bar, false);
         }
@@ -174,7 +175,7 @@ namespace Apache.Ignite.Core.Tests.Binary
         {
             // Min values.
             var val = new EnumsBinarizable();
-            
+
             CheckSerializeDeserialize(val);
 
             // Max values.
@@ -201,7 +202,7 @@ namespace Apache.Ignite.Core.Tests.Binary
         {
             // Null values.
             var val = new EnumsBinaryForm();
-            
+
             CheckSerializeDeserialize(val);
 
             // Max values.
@@ -228,7 +229,7 @@ namespace Apache.Ignite.Core.Tests.Binary
         {
             // Default values.
             var val = new EnumsBinarizableNullable();
-            
+
             CheckSerializeDeserialize(val);
 
             // Max values.
@@ -362,8 +363,8 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             private bool Equals(EnumsBinarizable other)
             {
-                return Byte == other.Byte && SByte == other.SByte && Short == other.Short 
-                    && UShort == other.UShort && Int == other.Int && UInt == other.UInt 
+                return Byte == other.Byte && SByte == other.SByte && Short == other.Short
+                    && UShort == other.UShort && Int == other.Int && UInt == other.UInt
                     && Long == other.Long && ULong == other.ULong;
             }
 
@@ -448,8 +449,8 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             private bool Equals(EnumsBinarizableNullable other)
             {
-                return Byte == other.Byte && SByte == other.SByte && Short == other.Short 
-                    && UShort == other.UShort && Int == other.Int && UInt == other.UInt 
+                return Byte == other.Byte && SByte == other.SByte && Short == other.Short
+                    && UShort == other.UShort && Int == other.Int && UInt == other.UInt
                     && Long == other.Long && ULong == other.ULong;
             }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTestOnline.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTestOnline.cs
index 0c82696..e7713ff 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTestOnline.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/EnumsTestOnline.cs
@@ -22,6 +22,7 @@ namespace Apache.Ignite.Core.Tests.Binary
     /// <summary>
     /// Enums test with Ignite running.
     /// </summary>
+    [TestFixture]
     public class EnumsTestOnline : EnumsTest
     {
         /// <summary>
@@ -42,4 +43,4 @@ namespace Apache.Ignite.Core.Tests.Binary
             Ignition.StopAll(true);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaBinaryInteropTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaBinaryInteropTest.cs
index 9343799..2faed93 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaBinaryInteropTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/JavaBinaryInteropTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+// ReSharper disable NonReadonlyMemberInGetHashCode
 namespace Apache.Ignite.Core.Tests.Binary
 {
     using System;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/AdvancedSerializationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/AdvancedSerializationTest.cs
index 5665d71..edb6f35 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/AdvancedSerializationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/AdvancedSerializationTest.cs
@@ -21,8 +21,10 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
     using System.Collections.Generic;
     using System.Data;
     using System.Linq;
+#if !NETCOREAPP  // AppDomains are not supported in .NET Core
     using System.Reflection;
     using System.Reflection.Emit;
+#endif
     using System.Runtime.Serialization;
     using System.Xml;
     using Apache.Ignite.Core.Cluster;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/BasicSerializableObjectsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/BasicSerializableObjectsTest.cs
index 846cd4c..24c69dd 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/BasicSerializableObjectsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/BasicSerializableObjectsTest.cs
@@ -63,7 +63,7 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
         public void TestMissingCtor()
         {
             var ex = Assert.Throws<SerializationException>(() => TestUtils.SerializeDeserialize(new MissingCtor()));
-            Assert.AreEqual(string.Format("The constructor to deserialize an object of type '{0}' was not found.", 
+            Assert.AreEqual(string.Format("The constructor to deserialize an object of type '{0}' was not found.",
                 typeof(MissingCtor)), ex.Message);
         }
 
@@ -77,7 +77,7 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
 
             var res = TestUtils.SerializeDeserialize(type);
 
-            Assert.AreEqual(type, res);
+            Assert.AreEqual(type.AssemblyQualifiedName, res.AssemblyQualifiedName);
         }
 
         /// <summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/CallbacksTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/CallbacksTest.cs
index e3d4c51..145d73e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/CallbacksTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/CallbacksTest.cs
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+// ReSharper disable UnusedParameter.Local
+// ReSharper disable UnusedMember.Local
 namespace Apache.Ignite.Core.Tests.Binary.Serializable
 {
     using System;
@@ -196,7 +198,7 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
         public void TestIncorrectMethodSignature()
         {
             var ex = Assert.Catch(() => TestUtils.SerializeDeserialize(new InvalidCallbackSignature()));
-            
+
             var tex = ex as TargetInvocationException;
             ex = tex != null ? tex.InnerException : ex;
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/DelegatesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/DelegatesTest.cs
index 90720d4..cedc624 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/DelegatesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/DelegatesTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP // Serializing delegates is not supported on this platform
 namespace Apache.Ignite.Core.Tests.Binary.Serializable
 {
     using System;
@@ -159,3 +160,4 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
index b9c8afe..b368d81 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
@@ -17,17 +17,18 @@
 
 // ReSharper disable UnusedMember.Local
 // ReSharper disable UnusedParameter.Local
+
 namespace Apache.Ignite.Core.Tests.Binary.Serializable
 {
     using System;
-    using System.IO;
     using System.Linq;
     using System.Runtime.Serialization;
-    using System.Text;
     using System.Threading;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cache.Configuration;
     using Apache.Ignite.Core.Cache.Query;
+    using Apache.Ignite.Core.Log;
+    using Apache.Ignite.Core.Tests.Client.Cache;
     using Apache.Ignite.Linq;
     using NUnit.Framework;
 
@@ -39,24 +40,19 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
         /** */
         private IIgnite _ignite;
 
-        /** */
-        private StringBuilder _outSb;
-
         /// <summary>
         /// Sets up the test fixture.
         /// </summary>
         [TestFixtureSetUp]
         public void FixtureSetUp()
         {
-            _outSb = new StringBuilder();
-            Console.SetError(new StringWriter(_outSb));
-
             var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 BinaryConfiguration = new BinaryConfiguration(typeof(SimpleSerializable))
                 {
-                    NameMapper = new BinaryBasicNameMapper { IsSimpleName = true }
-                }
+                    NameMapper = new BinaryBasicNameMapper {IsSimpleName = true}
+                },
+                Logger = new ListLogger(new TestUtils.TestContextLogger()) {EnabledLevels = new[] {LogLevel.Warn}}
             };
 
             _ignite = Ignition.Start(cfg);
@@ -165,25 +161,24 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
             Assert.AreEqual("Value was either too large or too small for a UInt32.", ex.Message);
         }
 
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0// Console redirect issues on .NET Core
         /// <summary>
         /// Tests the log warning.
         /// </summary>
         [Test]
         public void TestLogWarning()
         {
-            Thread.Sleep(10);  // Wait for logger update.
+            Thread.Sleep(10); // Wait for logger update.
 
             var expected =
-                string.Format("[WARN ][main][Marshaller] Type '{0}' implements '{1}'. " +
+                string.Format("Type '{0}' implements '{1}'. " +
                               "It will be written in Ignite binary format, however, " +
                               "the following limitations apply: DateTime fields would not work in SQL; " +
                               "sbyte, ushort, uint, ulong fields would not work in DML.",
                     typeof(SimpleSerializable), typeof(ISerializable));
 
-            Assert.IsTrue(_outSb.ToString().Contains(expected));
+            var messages = ((ListLogger) _ignite.Logger).Entries.Select(e => e.Message).ToList();
+            Assert.IsTrue(messages.Contains(expected), string.Join(Environment.NewLine, messages));
         }
-#endif
 
         /// <summary>
         /// Serializable with Java-compatible fields.
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs
index 6ed1a5f..dd1cb35 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeResolverTest.cs
@@ -19,11 +19,12 @@ namespace Apache.Ignite.Core.Tests.Binary
 {
     using System;
     using System.Collections.Generic;
+#if !NETCOREAPP
     using System.Linq;
     using System.Reflection;
+#endif
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Tests.TestDll;
     using NUnit.Framework;
 
     /// <summary>
@@ -85,7 +86,7 @@ namespace Apache.Ignite.Core.Tests.Binary
                 // Without assembly
                 var resolvedType = new TypeResolver().ResolveType(type.FullName);
                 Assert.AreEqual(type.FullName, resolvedType.FullName);
-                
+
                 // With assembly
                 resolvedType = new TypeResolver().ResolveType(type.FullName, type.Assembly.FullName);
                 Assert.AreEqual(type.FullName, resolvedType.FullName);
@@ -105,7 +106,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             var resolver = new TypeResolver();
             var mapper = BinaryBasicNameMapper.SimpleNameInstance;
 
-            Assert.AreEqual(typeof(TestGenericBinarizable<int>), 
+            Assert.AreEqual(typeof(TestGenericBinarizable<int>),
                 resolver.ResolveType("TestGenericBinarizable`1[[Int32]]", nameMapper: mapper));
 
             Assert.IsNull(resolver.ResolveType("TestGenericBinarizable`1[[Invalid-Type]]", nameMapper: mapper));
@@ -145,8 +146,8 @@ namespace Apache.Ignite.Core.Tests.Binary
             Assert.AreEqual(typeof(int[,,][,]), resolver.ResolveType("System.Int32[,][,,]"));
 
             Assert.AreEqual(typeof(int).MakeArrayType(1), resolver.ResolveType("System.Int32[*]"));
-            
-            Assert.AreEqual(typeof(TestGenericBinarizable<TypeResolverTest>[]), 
+
+            Assert.AreEqual(typeof(TestGenericBinarizable<TypeResolverTest>[]),
                 resolver.ResolveType("Apache.Ignite.Core.Tests.TestGenericBinarizable`1" +
                                      "[[Apache.Ignite.Core.Tests.Binary.TypeResolverTest]][]"));
         }
@@ -170,6 +171,7 @@ namespace Apache.Ignite.Core.Tests.Binary
                 resolver.ResolveType("TestGenericBinarizable`1[[TypeResolverTest]][]", nameMapper: mapper));
         }
 
+#if !NETCOREAPP
         /// <summary>
         /// Tests loading a type from referenced assembly that is not yet loaded.
         /// </summary>
@@ -189,7 +191,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             // Check resolver
             var type = new TypeResolver().ResolveType(typeName);
-            
+
             Assert.IsNotNull(type);
             Assert.AreEqual(typeName, type.FullName);
             Assert.IsNotNull(Activator.CreateInstance(type));
@@ -205,7 +207,8 @@ namespace Apache.Ignite.Core.Tests.Binary
         /// </summary>
         public void UnusedMethod()
         {
-            Assert.IsNotNull(typeof(TestClass));
-        }        
+            Assert.IsNotNull(typeof(TestDll.TestClass));
+        }
+#endif
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
index 6fde42f..76966b2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
@@ -16,6 +16,7 @@
  */
 
 // ReSharper disable MissingSerializationAttribute
+// ReSharper disable NonReadonlyMemberInGetHashCode
 namespace Apache.Ignite.Core.Tests.Cache
 {
     using System;
@@ -117,7 +118,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             return Ignition.GetIgnite("grid-" + idx);
         }
 
-        protected ICache<int, int> Cache(int idx, bool async = false) 
+        protected ICache<int, int> Cache(int idx, bool async = false)
         {
             return Cache<int, int>(idx, async);
         }
@@ -238,15 +239,15 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             cache.Put(key1, 1);
 
-            int val;
+            int unused;
 
             Assert.AreEqual(1, cache.LocalPeek(key1));
             Assert.Throws<KeyNotFoundException>(() => cache.LocalPeek(-1));
-            Assert.IsFalse(cache.TryLocalPeek(-1, out val));
+            Assert.IsFalse(cache.TryLocalPeek(-1, out unused));
 
             Assert.AreEqual(1, cache.LocalPeek(key1, CachePeekMode.All));
             Assert.Throws<KeyNotFoundException>(() => cache.LocalPeek(-1, CachePeekMode.All));
-            Assert.AreEqual(false, cache.TryLocalPeek(-1, out val, CachePeekMode.All));
+            Assert.AreEqual(false, cache.TryLocalPeek(-1, out unused, CachePeekMode.All));
         }
 
         [Test]
@@ -993,8 +994,8 @@ namespace Apache.Ignite.Core.Tests.Cache
             {
                 cache.LocalClear(key);
 
-                int val;
-                Assert.IsFalse(cache.TryLocalPeek(key, out val));
+                int unused;
+                Assert.IsFalse(cache.TryLocalPeek(key, out unused));
 
                 Assert.Less(cache.GetSize(), i);
 
@@ -1015,10 +1016,10 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             cache.LocalClearAll(keys);
 
-            int val;
+            int unused;
 
             foreach (var key in keys)
-                Assert.IsFalse(cache.TryLocalPeek(key, out val));
+                Assert.IsFalse(cache.TryLocalPeek(key, out unused));
 
             cache.Clear();
         }
@@ -1217,7 +1218,7 @@ namespace Apache.Ignite.Core.Tests.Cache
                 foreach (var key in keys)
                 {
                     var p = GetIgnite(i).GetAffinity(cache.Name).GetPartition(key);
-                    
+
                     Assert.GreaterOrEqual(cache.GetSizeLong(p, CachePeekMode.Primary), 1);
                 }
             }
@@ -1256,16 +1257,16 @@ namespace Apache.Ignite.Core.Tests.Cache
             Assert.AreEqual(0, cache.GetLocalSizeLong(CachePeekMode.Onheap));
             Assert.AreEqual(localSize, cache.GetLocalSize(CachePeekMode.All));
             Assert.AreEqual(localSize, cache.GetLocalSizeLong(CachePeekMode.All));
-            
+
             cache.Put(keys[2], 3);
 
             Assert.AreEqual(localSize + 1, cache.GetLocalSize(CachePeekMode.All));
             Assert.AreEqual(localSize + 1, cache.GetLocalSizeLong(CachePeekMode.All));
-            
+
             foreach (var key in keys)
             {
                 var p = Affinity().GetPartition(key);
-                    
+
                 Assert.GreaterOrEqual(cache.GetLocalSizeLong(p, CachePeekMode.All), 1);
             }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
index 155375d..d990dc9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
@@ -45,19 +45,18 @@ namespace Apache.Ignite.Core.Tests.Cache
 
         /** Cache name: dummy. */
         private const string CacheDummy = "dummy";
-        
+
         /// <summary>
         /// Set up routine.
         /// </summary>
         [SetUp]
         public void SetUp()
         {
-            TestUtils.KillProcesses();
             Ignition.StopAll(true);
 
-            Ignition.Start(CreateConfiguration(GridData, @"config/dynamic/dynamic-data.xml"));
-            Ignition.Start(CreateConfiguration(GridDataNoCfg, @"config/dynamic/dynamic-data-no-cfg.xml"));
-            Ignition.Start(CreateConfiguration(GridClient, @"config/dynamic/dynamic-client.xml"));
+            Ignition.Start(CreateConfiguration(GridData, @"Config/Dynamic/dynamic-data.xml"));
+            Ignition.Start(CreateConfiguration(GridDataNoCfg, @"Config/Dynamic/dynamic-data-no-cfg.xml"));
+            Ignition.Start(CreateConfiguration(GridClient, @"Config/Dynamic/dynamic-client.xml"));
         }
 
         /// <summary>
@@ -133,7 +132,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cacheData = Ignition.GetIgnite(GridData).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
 
-            var cacheDataNoCfg = 
+            var cacheDataNoCfg =
                 Ignition.GetIgnite(GridDataNoCfg).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
 
             var cacheClient = Ignition.GetIgnite(GridClient).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
@@ -199,6 +198,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             /** <inheritdoc /> */
             public override int GetHashCode()
             {
+                // ReSharper disable once NonReadonlyMemberInGetHashCode
                 return Id;
             }
         }
@@ -233,6 +233,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             /** <inheritdoc /> */
             public override int GetHashCode()
             {
+                // ReSharper disable once NonReadonlyMemberInGetHashCode
                 return Id;
             }
         }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
index d2c33d2..dc8911b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP
 namespace Apache.Ignite.Core.Tests.Cache
 {
     using System.IO;
@@ -35,8 +36,8 @@ namespace Apache.Ignite.Core.Tests.Cache
         [TestFixtureSetUp]
         public void SetUp()
         {
-            const string springConfigUrl = "config\\compute\\compute-grid1.xml";
-            
+            const string springConfigUrl = "Config/Compute/compute-grid1.xml";
+
             // ReSharper disable once UnusedVariable
             var proc = new IgniteProcess(
                 "-springConfigUrl=" + Path.GetFullPath(springConfigUrl),
@@ -77,3 +78,4 @@ namespace Apache.Ignite.Core.Tests.Cache
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheQueryMetricsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheQueryMetricsTest.cs
index 5b85328..70eba6f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheQueryMetricsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheQueryMetricsTest.cs
@@ -18,7 +18,6 @@
 // ReSharper disable UnusedAutoPropertyAccessor.Local
 namespace Apache.Ignite.Core.Tests.Cache
 {
-    extern alias ExamplesDll;
     using System.Collections.Generic;
     using System.Diagnostics.CodeAnalysis;
     using System.Linq;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs
index 6e8a261..605e12b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs
@@ -53,6 +53,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         /** <inheritdoc /> */
         public override int GetHashCode()
         {
+            // ReSharper disable once NonReadonlyMemberInGetHashCode
             return Id;
         }
 
@@ -65,4 +66,4 @@ namespace Apache.Ignite.Core.Tests.Cache
                 .Append(']').ToString();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NearCacheTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NearCacheTest.cs
index a9d12cc..b057bae 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NearCacheTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NearCacheTest.cs
@@ -32,7 +32,7 @@ namespace Apache.Ignite.Core.Tests.Cache
 
         /** */
         private IIgnite _client;
-        
+
         /** */
         private volatile CacheEvent _lastEvent;
 
@@ -49,7 +49,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             };
 
             _grid = Ignition.Start(cfg);
-            
+
             var clientCfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 ClientMode = true,
@@ -100,7 +100,7 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             // Update entry.
             cache[1] = 2;
-            Assert.True(TestUtils.WaitForCondition(() => nearCache[1] == 2, 300));
+            TestUtils.WaitForTrueCondition(() => nearCache[1] == 2);
 
             // Update through near.
             nearCache[1] = 3;
@@ -108,7 +108,7 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             // Remove.
             cache.Remove(1);
-            Assert.True(TestUtils.WaitForCondition(() => !nearCache.ContainsKey(1), 300));
+            TestUtils.WaitForTrueCondition(() => !nearCache.ContainsKey(1));
         }
 
         /// <summary>
@@ -142,7 +142,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             cache[1] = 1;
             Assert.AreEqual(1, cache[1]);
 
-            var cache2 = _client.GetOrCreateCache<int, int>(new CacheConfiguration(cacheName), 
+            var cache2 = _client.GetOrCreateCache<int, int>(new CacheConfiguration(cacheName),
                 new NearCacheConfiguration());
 
             Assert.AreEqual(1, cache2[1]);
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/PartitionLossTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/PartitionLossTest.cs
index d502550..d138654 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/PartitionLossTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/PartitionLossTest.cs
@@ -131,6 +131,7 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             // Loose data and verify lost partition.
             var lostPart = PrepareTopology();
+            TestUtils.WaitForTrueCondition(() => cache.GetLostPartitions().Any());
             var lostParts = cache.GetLostPartitions();
             Assert.IsTrue(lostParts.Contains(lostPart));
 
@@ -141,8 +142,9 @@ namespace Apache.Ignite.Core.Tests.Cache
 
                 // Check reads are possible from a cache in recovery mode.
                 var recoverCache = cache.WithPartitionRecover();
-                int res;
-                Assert.IsFalse(recoverCache.TryGet(part, out res));
+
+                int unused;
+                Assert.IsFalse(recoverCache.TryGet(part, out unused));
             }
 
             // Reset and verify.
@@ -151,6 +153,7 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             // Check another ResetLostPartitions overload.
             PrepareTopology();
+            TestUtils.WaitForTrueCondition(() => cache.GetLostPartitions().Any());
             Assert.IsNotEmpty(cache.GetLostPartitions());
             ignite.ResetLostPartitions(new List<string> {CacheName, "foo"});
             Assert.IsEmpty(cache.GetLostPartitions());
@@ -163,8 +166,9 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             if (safe)
             {
-                int val;
-                var ex = Assert.Throws<CacheException>(() => cache.TryGet(part, out val));
+                int unused;
+                var ex = Assert.Throws<CacheException>(() => cache.TryGet(part, out unused));
+
                 Assert.AreEqual(string.Format(
                     "class org.apache.ignite.internal.processors.cache.CacheInvalidStateException" +
                     ": Failed to execute the cache operation (all partition owners have left the grid, " +
@@ -174,8 +178,8 @@ namespace Apache.Ignite.Core.Tests.Cache
             }
             else
             {
-                int val;
-                Assert.IsFalse(cache.TryGet(part, out val));
+                int unused;
+                Assert.IsFalse(cache.TryGet(part, out unused));
             }
 
             if (canWrite)
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Platform/PlatformCacheTopologyChangeTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Platform/PlatformCacheTopologyChangeTest.cs
index a9e596d..9e0b4a6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Platform/PlatformCacheTopologyChangeTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Platform/PlatformCacheTopologyChangeTest.cs
@@ -58,7 +58,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
         {
             Ignition.StopAll(true);
         }
-        
+
         /// <summary>
         /// Tests that platform cache is cleared for the key when primary node leaves.
         /// </summary>
@@ -85,7 +85,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             Assert.Throws<KeyNotFoundException>(() => _cache[0].Get(Key3));
             Assert.Throws<KeyNotFoundException>(() => _cache[1].Get(Key3));
             Assert.Throws<KeyNotFoundException>(() => clientCache.Get(Key3));
-            
+
             // Check that updates for that key work on all nodes.
             _cache[0][Key3] = new Foo(1);
             Assert.AreEqual(1, _cache[0][Key3].Bar);
@@ -94,12 +94,12 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             Assert.AreSame(_cache[0][Key3], _cache[0][Key3]);
             Assert.AreSame(_cache[1][Key3], _cache[1][Key3]);
             Assert.AreSame(clientCache[Key3], clientCache[Key3]);
-            
+
             _cache[1][Key3] = new Foo(2);
             TestUtils.WaitForTrueCondition(() => _cache[0][Key3].Bar == 2, 500);
             Assert.AreEqual(2, _cache[0][Key3].Bar);
             Assert.AreEqual(2, _cache[1][Key3].Bar);
-            
+
             TestUtils.WaitForTrueCondition(() => clientCache[Key3].Bar == 2);
             Assert.AreSame(_cache[0][Key3], _cache[0][Key3]);
             Assert.AreSame(_cache[1][Key3], _cache[1][Key3]);
@@ -114,7 +114,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
         public void TestPrimaryNodeChangeClearsPlatformCacheDataOnServer()
         {
             InitNodes(2);
-            
+
             _cache[0][Key3] = new Foo(-1);
             for (var i = 0; i < 2; i++)
             {
@@ -123,33 +123,33 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
 
             // New node enters and becomes primary for the key.
             InitNode(2);
-            
+
             // GridCacheNearEntry does not yet exist on old primary node, so platform cache data is removed on .NET side.
-            Foo foo;
-            Assert.IsFalse(_cache[0].TryLocalPeek(Key3, out foo, CachePeekMode.Platform));
-            Assert.IsFalse(_cache[1].TryLocalPeek(Key3, out foo, CachePeekMode.Platform));
-            
+            Foo unused;
+            Assert.IsFalse(_cache[0].TryLocalPeek(Key3, out unused, CachePeekMode.Platform));
+            Assert.IsFalse(_cache[1].TryLocalPeek(Key3, out unused, CachePeekMode.Platform));
+
             // Check value on the new node: it should be already in platform cache, because key is primary.
             Assert.AreEqual(-1, _cache[2].LocalPeek(Key3, CachePeekMode.Platform).Bar);
             Assert.AreEqual(-1, _cache[2][Key3].Bar);
             Assert.AreSame(_cache[2][Key3], _cache[2][Key3]);
-            
+
             // Check that updates are propagated to all server nodes.
             _cache[2][Key3] = new Foo(3);
-            
+
             for (var i = 0; i < 3; i++)
             {
                 TestUtils.WaitForTrueCondition(() => _cache[i][Key3].Bar == 3);
                 Assert.AreSame(_cache[i][Key3], _cache[i][Key3]);
             }
         }
-        
+
         /// <summary>
         /// Tests that platform cache works correctly on client node after primary node changes for a given key.
         /// </summary>
         [Test]
         public void TestPrimaryNodeChangeClearsPlatformCacheDataOnClient(
-            [Values(PlatformCheckMode.Entries, PlatformCheckMode.Peek, PlatformCheckMode.Size, PlatformCheckMode.TryPeek)] 
+            [Values(PlatformCheckMode.Entries, PlatformCheckMode.Peek, PlatformCheckMode.Size, PlatformCheckMode.TryPeek)]
             PlatformCheckMode checkMode)
         {
             InitNodes(2);
@@ -159,10 +159,10 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
 
             var clientInstance = clientCache[Key3];
             Assert.AreEqual(-1, clientInstance.Bar);
-            
+
             // New node enters and becomes primary for the key.
             InitNode(2);
-            
+
             // Client node cache is cleared.
             // Check with different methods: important because every method calls entry validation separately
             // (covers all PlatformCache.IsValid calls).
@@ -171,27 +171,27 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
                 case PlatformCheckMode.Peek:
                     Assert.Throws<KeyNotFoundException>(() => clientCache.LocalPeek(Key3, CachePeekMode.Platform));
                     break;
-                
+
                 case PlatformCheckMode.TryPeek:
                     Foo _;
                     Assert.IsFalse(clientCache.TryLocalPeek(Key3, out _, CachePeekMode.Platform));
                     break;
-                
+
                 case PlatformCheckMode.Size:
                     Assert.AreEqual(0, clientCache.GetLocalSize(CachePeekMode.Platform));
                     break;
-                
+
                 case PlatformCheckMode.Entries:
                     Assert.AreEqual(0, clientCache.GetLocalEntries(CachePeekMode.Platform).Count());
                     break;
-                
+
                 default:
                     throw new ArgumentOutOfRangeException();
             }
-            
+
             // Updates are propagated to client platform cache.
             _cache[2][Key3] = new Foo(3);
-            
+
             TestUtils.WaitForTrueCondition(() => clientCache[Key3].Bar == 3);
 
             Foo foo;
@@ -211,19 +211,19 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             InitNodes(2);
             var clientCache = InitClientAndCache();
             var serverCache = _cache[0];
-            
+
             serverCache[key] = new Foo(-1);
             Assert.AreEqual(-1, clientCache[key].Bar);
-            
+
             var clientInstance = clientCache[key];
             var serverInstance = serverCache[key];
-            
+
             // New node enters, but key stays on the same primary node.
             InitNode(2);
 
             Assert.AreSame(clientInstance, clientCache[key]);
             Assert.AreSame(serverInstance, serverCache[key]);
-            
+
             Assert.AreEqual(-1, clientInstance.Bar);
             Assert.AreEqual(-1, serverInstance.Bar);
         }
@@ -236,7 +236,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
         {
             InitNodes(2);
             _cache[2] = InitClientAndCache();
-            
+
             TestUtils.WaitForTrueCondition(() => TestUtils.GetPrimaryKey(_ignite[1], CacheName) == 1, 3000);
 
             Action<Action<ICache<int, Foo>, int>> forEachCacheAndKey = act =>
@@ -253,8 +253,8 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             };
 
             Action<int> putData = offset => forEachCacheAndKey((cache, key) => cache[key] = new Foo(key + offset));
-            
-            Action<int> checkPlatformData = offset => forEachCacheAndKey((cache, key) => 
+
+            Action<int> checkPlatformData = offset => forEachCacheAndKey((cache, key) =>
                 Assert.AreEqual(key + offset, cache.LocalPeek(key, CachePeekMode.Platform).Bar));
 
             // Put data and verify platform cache.
@@ -272,7 +272,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             checkPlatformData(1);
             putData(2);
             checkPlatformData(2);
-            
+
             Assert.AreEqual(3, _cache[0][1].Bar);
         }
 
@@ -300,7 +300,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
                 // Change topology randomly.
                 var idx = rnd.Next(1, 5);
                 Console.WriteLine(">>> Changing topology: " + idx);
-                
+
                 if (_ignite[idx] == null)
                 {
                     InitNode(idx, waitForPrimary: false);
@@ -313,9 +313,9 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
                 var dataLost = serverCache.GetSize(CachePeekMode.Primary | CachePeekMode.Backup) == 0;
                 var status = string.Format("Node {0}: {1}, data lost: {2}, current val: {3}",
                     _ignite[idx] == null ? "stopped" : "started", idx, dataLost, val);
-                
+
                 Console.WriteLine(">>> " + status);
-                
+
                 // Verify data.
                 if (dataLost)
                 {
@@ -327,7 +327,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
                     Assert.AreEqual(val, serverCache[key].Bar, status);
                     Assert.AreEqual(val, clientCache[key].Bar, status);
                 }
-                
+
                 // Update data and verify.
                 val++;
                 (val % 2 == 0 ? serverCache : clientCache)[key] = new Foo(val);
@@ -346,45 +346,45 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             InitNodes(1);
             var clientCache = InitClientAndCache();
             var client = Ignition.GetAll().Single(c => c.GetConfiguration().ClientMode);
-            
+
             var keys = Enumerable.Range(1, 100).ToList();
             keys.ForEach(k => clientCache[k] = new Foo(k));
             Assert.AreEqual(keys.Count, clientCache.GetLocalSize(CachePeekMode.Platform));
             Assert.IsNotNull(clientCache.GetConfiguration().NearConfiguration);
-            
+
             // Stop the only server node, client goes into disconnected mode.
             var evt = new ManualResetEventSlim(false);
-            client.ClientDisconnected += (sender, args) => evt.Set(); 
-            
+            client.ClientDisconnected += (sender, args) => evt.Set();
+
             StopNode(0);
             Assert.IsTrue(evt.Wait(TimeSpan.FromSeconds(10)), "ClientDisconnected event should be fired");
-            
+
             var reconnectTask = client.GetCluster().ClientReconnectTask;
-            
+
             // Start server again, client reconnects.
             InitNodes(1);
             Assert.IsTrue(reconnectTask.Wait(TimeSpan.FromSeconds(10)));
-            
+
             // Platform cache is empty.
             Assert.AreEqual(0, clientCache.GetLocalSize(CachePeekMode.Platform));
             Assert.IsEmpty(clientCache.GetLocalEntries(CachePeekMode.Platform));
             Assert.Throws<KeyNotFoundException>(() => clientCache.LocalPeek(1, CachePeekMode.Platform));
-            
+
             // Cache still works for new entries, platform cache is being bypassed.
             var serverCache = _cache[0];
-            
+
             serverCache[1] = new Foo(11);
             Assert.AreEqual(11, clientCache[1].Bar);
-            
+
             serverCache[1] = new Foo(22);
-            
+
             var foo = clientCache[1];
             Assert.AreEqual(22, foo.Bar);
             Assert.AreNotSame(foo, clientCache[1]);
-            
-            // This is a full cluster restart, so client platform cache is stopped. 
+
+            // This is a full cluster restart, so client platform cache is stopped.
             Assert.IsNull(clientCache.GetConfiguration().NearConfiguration);
-            
+
             var ex = Assert.Throws<CacheException>(() =>
                 client.GetOrCreateNearCache<int, Foo>(clientCache.Name, new NearCacheConfiguration()));
             StringAssert.Contains("cache with the same name without near cache is already started", ex.Message);
@@ -417,12 +417,12 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             var clientCache = client.GetOrCreateNearCache<int, Foo>(CacheName, new NearCacheConfiguration());
             clientCache[1] = new Foo(2);
             Assert.AreEqual(2, clientCache.LocalPeek(1, CachePeekMode.Platform).Bar);
-            
+
             PerformClientReconnect(client);
-            
+
             // Platform cache data is removed after disconnect.
             Assert.AreEqual(0, clientCache.GetLocalSize(CachePeekMode.Platform));
-            
+
             // Updates work as expected.
             Assert.AreEqual(2, clientCache[1].Bar);
             serverCache[1] = new Foo(33);
@@ -438,15 +438,15 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
         {
             InitNodes(1);
             var cache = InitClientAndCache();
-            
+
             cache[1] = new Foo(1);
-            
+
             // Change topology by starting a new cache.
             _ignite[0].CreateCache<int, int>("x");
 
             var foo = cache.Get(1);
             Assert.AreEqual(1, foo.Bar);
-            
+
             // Warmup.
             for (var i = 0; i < 100; i++)
             {
@@ -455,7 +455,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
 
             const int count = 1000000;
             var sw = Stopwatch.StartNew();
-            
+
             for (var i = 0; i < count; i++)
             {
                 var res = cache.Get(1);
@@ -464,10 +464,10 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
                     Assert.Fail();
                 }
             }
-            
+
             var elapsed = sw.Elapsed;
             Assert.Less(elapsed, TimeSpan.FromSeconds(5));
-            
+
             Console.WriteLine(">>> Retrieved {0} entries in {1}.", count, elapsed);
         }
 
@@ -477,7 +477,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
         private void InitNodes(int count, bool serverNear = true, int backups = 0)
         {
             Debug.Assert(count < MaxNodes);
-            
+
             _ignite = new IIgnite[MaxNodes];
             _cache = new ICache<int, Foo>[MaxNodes];
 
@@ -498,17 +498,17 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
                 PlatformCacheConfiguration = serverNear ? new PlatformCacheConfiguration() : null,
                 Backups = backups
             };
-            
+
             _ignite[i] = Ignition.Start(TestUtils.GetTestConfiguration(name: "node" + i));
             _cache[i] = _ignite[i].GetOrCreateCache<int, Foo>(cacheConfiguration);
-            
+
             if (i == 2 && waitForPrimary)
             {
                 // ReSharper disable once AccessToDisposedClosure
                 TestUtils.WaitForTrueCondition(() => TestUtils.GetPrimaryKey(_ignite[2], CacheName) == Key3, 300000);
             }
         }
-        
+
         /// <summary>
         /// Inits a client node and a near cache on it.
         /// </summary>
@@ -531,7 +531,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
 
             return Ignition.Start(cfg);
         }
-        
+
         /// <summary>
         /// Stops node.
         /// </summary>
@@ -540,7 +540,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             _ignite[idx].Dispose();
             _ignite[idx] = null;
         }
-        
+
         private static void ResumeThreads(string gridName)
         {
             CallStringMethod(gridName, "org/apache/ignite/platform/PlatformThreadUtils", "resume",
@@ -562,8 +562,8 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             };
 
             var gridName = string.Format("%{0}%", client.Name);
-            SuspendThreads(gridName);
-            Thread.Sleep(7000);
+            SuspendJavaThreads(gridName);
+            Thread.Sleep(9000);
             ResumeThreads(gridName);
 
             Assert.Catch(() => client.CreateCache<int, int>("_fail").Put(1, 1));
@@ -578,7 +578,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             Assert.IsFalse(reconnectEventArgs.HasClusterRestarted);
         }
 
-        private static void SuspendThreads(string gridName)
+        private static void SuspendJavaThreads(string gridName)
         {
             CallStringMethod(gridName, "org/apache/ignite/platform/PlatformThreadUtils", "suspend",
                 "(Ljava/lang/String;)V");
@@ -611,4 +611,4 @@ namespace Apache.Ignite.Core.Tests.Cache.Platform
             Entries
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
index fbbaf0b..b9a5798 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
@@ -16,6 +16,7 @@
  */
 
 // ReSharper disable UnusedAutoPropertyAccessor.Local
+// ReSharper disable NonReadonlyMemberInGetHashCode
 namespace Apache.Ignite.Core.Tests.Cache.Query
 {
     using System;
@@ -111,8 +112,8 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
             {
                 Fields = new[]
                 {
-                    new QueryField("id", typeof(int)) {NotNull = true}, 
-                    new QueryField("name", typeof(string)) 
+                    new QueryField("id", typeof(int)) {NotNull = true},
+                    new QueryField("name", typeof(string))
                 }
             });
 
@@ -163,7 +164,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
         /// </summary>
         private static void TestKey<T>(params T[] vals)
         {
-            var cfg = new CacheConfiguration("primitive_key_dotnet_" + typeof(T), 
+            var cfg = new CacheConfiguration("primitive_key_dotnet_" + typeof(T),
                 new QueryEntity(typeof(T), typeof(string)));
             var cache = Ignition.GetIgnite().CreateCache<T, string>(cfg);
 
@@ -397,7 +398,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
             // Attribute-based config.
             var cfg = new CacheConfiguration("def_value_attr", new QueryEntity(typeof(int), typeof(Foo)));
             Assert.AreEqual(-1, cfg.QueryEntities.Single().Fields.Single(x => x.Name == "Id").DefaultValue);
-            
+
             var cache = Ignition.GetIgnite().CreateCache<int, Foo>(cfg);
             Assert.AreEqual(-1,
                 cache.GetConfiguration().QueryEntities.Single().Fields.Single(x => x.Name == "Id").DefaultValue);
@@ -491,10 +492,10 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
 
             private bool Equals(KeyAll other)
             {
-                return Byte == other.Byte && SByte == other.SByte && Short == other.Short && 
-                    UShort == other.UShort && Int == other.Int && UInt == other.UInt && Long == other.Long && 
-                    ULong == other.ULong && Float.Equals(other.Float) && Double.Equals(other.Double) && 
-                    Decimal == other.Decimal && Guid.Equals(other.Guid) && string.Equals(String, other.String) && 
+                return Byte == other.Byte && SByte == other.SByte && Short == other.Short &&
+                    UShort == other.UShort && Int == other.Int && UInt == other.UInt && Long == other.Long &&
+                    ULong == other.ULong && Float.Equals(other.Float) && Double.Equals(other.Double) &&
+                    Decimal == other.Decimal && Guid.Equals(other.Guid) && string.Equals(String, other.String) &&
                     Key.Equals(other.Key);
             }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
index 6697ee4..e3b1fd1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
@@ -707,30 +707,30 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
         }
 
         /// <summary>
-        /// Test whether timeout works fine.
+        /// Test that TimeInterval causes incomplete buffer to be sent when BufferSize is greater than 1.
         /// </summary>
         [Test]
-        public void TestTimeout()
+        public void TestTimeInterval()
         {
             int key1 = PrimaryKey(cache1);
             int key2 = PrimaryKey(cache2);
 
-            ContinuousQuery<int, BinarizableEntry> qry =
-                new ContinuousQuery<int, BinarizableEntry>(new Listener<BinarizableEntry>());
-
-            qry.BufferSize = 2;
-            qry.TimeInterval = TimeSpan.FromMilliseconds(500);
+            var qry = new ContinuousQuery<int, BinarizableEntry>(new Listener<BinarizableEntry>())
+            {
+                BufferSize = 2,
+                TimeInterval = TimeSpan.FromMilliseconds(500)
+            };
 
             using (cache1.QueryContinuous(qry))
             {
                 // Put from local node.
                 cache1.GetAndPut(key1, Entry(key1));
-                CheckCallbackSingle(key1, null, Entry(key1), CacheEntryEventType.Created);
+                CheckCallbackSingle(key1, null, Entry(key1), CacheEntryEventType.Created, 2000);
 
                 // Put from remote node.
                 cache1.GetAndPut(key2, Entry(key2));
                 CheckNoCallback(100);
-                CheckCallbackSingle(key2, null, Entry(key2), CacheEntryEventType.Created);
+                CheckCallbackSingle(key2, null, Entry(key2), CacheEntryEventType.Created, 2000);
             }
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
index a4f7e42..9c3a3406f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
@@ -16,6 +16,7 @@
  */
 
 // ReSharper disable UnusedAutoPropertyAccessor.Local
+// ReSharper disable NonReadonlyMemberInGetHashCode
 namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
 {
     using System;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Linq/CacheLinqTest.Strings.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Linq/CacheLinqTest.Strings.cs
index 57baf56..0c0aac0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Linq/CacheLinqTest.Strings.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Linq/CacheLinqTest.Strings.cs
@@ -66,7 +66,6 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Linq
 
             CheckFunc(x => x.Trim(), strings);
 
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0  // Trim is not supported on .NET Core
             CheckFunc(x => x.Trim('P'), strings);
             var toTrim = new[] { 'P' };
             CheckFunc(x => x.Trim(toTrim), strings);
@@ -83,7 +82,6 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Linq
             Assert.Throws<NotSupportedException>(() => CheckFunc(x => x.Trim(toTrimFails), strings));
             Assert.Throws<NotSupportedException>(() => CheckFunc(x => x.TrimStart(toTrimFails), strings));
             Assert.Throws<NotSupportedException>(() => CheckFunc(x => x.TrimEnd(toTrimFails), strings));
-#endif
 
             CheckFunc(x => Regex.Replace(x, @"son.\d", "kele!"), strings);
             CheckFunc(x => Regex.Replace(x, @"son.\d", "kele!", RegexOptions.None), strings);
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
index 52db794e..b2f10b0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
@@ -37,7 +37,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         {
             Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = "config\\native-client-test-cache-parallel-store.xml",
+                SpringConfigUrl = "Config/native-client-test-cache-parallel-store.xml",
             });
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
index 6c9def3..b69b402 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
@@ -55,7 +55,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         {
             return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = @"config\cache\store\cache-store-session.xml"
+                SpringConfigUrl = @"Config/Cache/Store/cache-store-session.xml"
             };
         }
 
@@ -77,12 +77,12 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
             {
                 TestUtils.AssertHandleRegistryHasItems(Ignition.GetIgnite(), 2, 1000);
             }
-            finally 
+            finally
             {
                 Ignition.StopAll(true);
             }
         }
-        
+
         /// <summary>
         /// Test basic session API.
         /// </summary>
@@ -221,7 +221,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                 }
 
                 return (ICollection<Operation>) ops;
-            } 
+            }
         }
 
         /// <summary>
@@ -257,7 +257,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
             /// Cache name.
             /// </summary>
             public string CacheName { get; private set; }
-            
+
             /// <summary>
             /// Operation type.
             /// </summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs
index 3a47139..e9de38d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs
@@ -31,7 +31,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         {
             return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = @"config\cache\store\cache-store-session-shared-factory.xml"
+                SpringConfigUrl = @"Config/Cache/Store/cache-store-session-shared-factory.xml"
             };
         }
 
@@ -45,4 +45,4 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTestCodeConfig.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTestCodeConfig.cs
index 0b6f771..bfb3544 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTestCodeConfig.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTestCodeConfig.cs
@@ -27,6 +27,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
     /// <summary>
     /// Tests cache store without Spring.
     /// </summary>
+    [TestFixture]
     public class CacheStoreTestCodeConfig : CacheStoreTest
     {
         /// <summary>
@@ -49,7 +50,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                         ReadThrough = true,
                         KeepBinaryInStore = true,
                         CacheStoreFactory = new StoreFactory()
-                    }, 
+                    },
                     new CacheConfiguration
                     {
                         Name = "object_store",
@@ -59,7 +60,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                         ReadThrough = true,
                         KeepBinaryInStore = false,
                         CacheStoreFactory = new StoreFactory()
-                    }, 
+                    },
                     new CacheConfiguration
                     {
                         Name = "template_store*",
@@ -69,7 +70,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                         ReadThrough = true,
                         KeepBinaryInStore = false,
                         CacheStoreFactory = new StoreFactory()
-                    }, 
+                    },
                     new CacheConfiguration
                     {
                         Name = "custom_store",
@@ -78,7 +79,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                         WriteThrough = true,
                         ReadThrough = true,
                         CacheStoreFactory = new CustomStoreFactory()
-                    }, 
+                    },
                 }
             };
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTest.cs
index 7ccb688..8f262e9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTest.cs
@@ -818,7 +818,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
         [Category(TestUtils.CategoryIntensive)]
         public void TestPutGetAsyncMultithreaded()
         {
-            const int count = 5000;
+            const int count = 1000;
 
             var cache = GetClientCache<string>();
             var key = 0;
@@ -989,7 +989,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             Assert.IsTrue(cache.ContainsKey(val));
 
             Thread.Sleep(50);
-            
+
             // Expiry policies should be applied, no cache item exists.
             Assert.IsFalse(cacheWithExpiryPolicy.ContainsKey(val));
             Assert.IsFalse(cache.ContainsKey(val));
@@ -1042,7 +1042,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             cacheWithExpiryPolicy.Put(val + 1, val);
 
             Thread.Sleep(200);
-            
+
             // Both caches contains the original value.
             Assert.IsTrue(cache.ContainsKey(val));
             Assert.IsTrue(cacheWithExpiryPolicy.ContainsKey(val));
@@ -1051,7 +1051,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             Assert.IsFalse(cache.ContainsKey(val + 1));
             Assert.IsFalse(cacheWithExpiryPolicy.ContainsKey(val + 1));
         }
-        
+
         /// <summary>
         /// Test cache with expiration does not modify keepBinary flag.
         /// </summary>
@@ -1068,7 +1068,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             AssertExtensions.ReflectionEqual(person, cacheWithKeepBinary.Get(key).Deserialize<Person>());
 
             var expiryPolicy = new ExpiryPolicy(null, null, TimeSpan.FromMilliseconds(100));
-            
+
             var cacheWithExpiryPolicy = cacheWithKeepBinary.WithExpiryPolicy(expiryPolicy);
             AssertExtensions.ReflectionEqual(person, cacheWithExpiryPolicy.Get(key).Deserialize<Person>());
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/ThinClient/Cache/CacheTestAsyncAwait.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTestAsyncAwait.cs
similarity index 96%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/ThinClient/Cache/CacheTestAsyncAwait.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTestAsyncAwait.cs
index c83414f..a3485d0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/ThinClient/Cache/CacheTestAsyncAwait.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/CacheTestAsyncAwait.cs
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-namespace Apache.Ignite.Core.Tests.DotNetCore.ThinClient.Cache
+namespace Apache.Ignite.Core.Tests.Client.Cache
 {
     using System.Threading.Tasks;
     using Apache.Ignite.Core.Tests.Client;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/ScanQueryTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/ScanQueryTest.cs
index ab17007..0566b0b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/ScanQueryTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cache/ScanQueryTest.cs
@@ -19,7 +19,6 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
 {
     using System;
     using System.Collections.Generic;
-    using System.Diagnostics;
     using System.Diagnostics.CodeAnalysis;
     using System.Linq;
     using Apache.Ignite.Core.Binary;
@@ -124,7 +123,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
                 var single = clientCache.Query(new ScanQuery<int, Person>(new PersonKeyFilter(3))).Single();
                 Assert.AreEqual(3, single.Key);
 
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0   // Serializing delegates is not supported on this platform.
+#if !NETCOREAPP   // Serializing delegates is not supported on this platform.
                 // Multiple results.
                 var res = clientCache.Query(new ScanQuery<int, Person>(new PersonFilter(x => x.Name.Length == 1)))
                     .ToList();
@@ -156,8 +155,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             }
         }
 
-
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0  // Serializing delegates and exceptions is not supported on this platform.
+#if !NETCOREAPP  // Serializing delegates and exceptions is not supported on this platform.
         /// <summary>
         /// Tests the exception in filter.
         /// </summary>
@@ -264,6 +262,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             return cache;
         }
 
+#if !NETCOREAPP  // Serializing delegates and exceptions is not supported on this platform.
         /// <summary>
         /// Person filter.
         /// </summary>
@@ -278,8 +277,6 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             /// <param name="filter">The filter.</param>
             public PersonFilter(Func<Person, bool> filter)
             {
-                Debug.Assert(filter != null);
-
                 _filter = filter;
             }
 
@@ -289,6 +286,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
                 return _filter(entry.Value);
             }
         }
+#endif
 
         /// <summary>
         /// Person filter.
@@ -299,7 +297,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             private readonly int _key;
 
             /// <summary>
-            /// Initializes a new instance of the <see cref="PersonFilter"/> class.
+            /// Initializes a new instance of the <see cref="PersonKeyFilter"/> class.
             /// </summary>
             public PersonKeyFilter(int key)
             {
@@ -322,7 +320,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cache
             private readonly int _id;
 
             /// <summary>
-            /// Initializes a new instance of the <see cref="PersonFilter"/> class.
+            /// Initializes a new instance of the <see cref="PersonIdFilterBinary"/> class.
             /// </summary>
             public PersonIdFilterBinary(int id)
             {
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientConnectionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientConnectionTest.cs
index f4e479e..3e8229e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientConnectionTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientConnectionTest.cs
@@ -349,7 +349,9 @@ namespace Apache.Ignite.Core.Tests.Client
 
             if (socketEx != null)
             {
-                Assert.AreEqual(SocketError.ConnectionAborted, socketEx.SocketErrorCode);
+                Assert.Contains(
+                    socketEx.SocketErrorCode,
+                    new[] {SocketError.ConnectionAborted, SocketError.ConnectionReset});
             }
             else
             {
@@ -398,10 +400,15 @@ namespace Apache.Ignite.Core.Tests.Client
         {
             Ignition.Start(TestUtils.GetTestConfiguration());
 
-            const int count = 100000;
+            const int count = 10000;
             var ops = new Task[count];
 
-            using (var client = StartClient())
+            var clientCfg = new IgniteClientConfiguration(GetClientConfiguration())
+            {
+                SocketTimeout = TimeSpan.FromSeconds(30)
+            };
+
+            using (var client = Ignition.StartClient(clientCfg))
             {
                 var cache = client.GetOrCreateCache<int, int>("foo");
                 Parallel.For(0, count, new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount},
@@ -411,11 +418,7 @@ namespace Apache.Ignite.Core.Tests.Client
                     });
             }
 
-            var completed = ops.Count(x => x.Status == TaskStatus.RanToCompletion);
-            Assert.Greater(completed, 0, "Some tasks should have completed.");
-
-            var failed = ops.Where(x => x.Status == TaskStatus.Faulted).ToArray();
-            Assert.IsTrue(failed.Any(), "Some tasks should have failed.");
+            var failed = ops.Where(x => x.Status == TaskStatus.Faulted);
 
             foreach (var task in failed)
             {
@@ -704,7 +707,8 @@ namespace Apache.Ignite.Core.Tests.Client
             return new IgniteClientConfiguration("localhost")
             {
                 UserName = "ignite",
-                Password = "ignite"
+                Password = "ignite",
+                SocketTimeout = TimeSpan.FromSeconds(10)
             };
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientTestBase.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientTestBase.cs
index 0c1c58c..ca421e2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientTestBase.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientTestBase.cs
@@ -159,7 +159,7 @@ namespace Apache.Ignite.Core.Tests.Client
         protected virtual IgniteClientConfiguration GetClientConfiguration()
         {
             var port = _enableSsl ? 11110 : IgniteClientConfiguration.DefaultPort;
-            
+
             return new IgniteClientConfiguration
             {
                 Endpoints = new List<string> {IPAddress.Loopback + ":" + port},
@@ -189,7 +189,7 @@ namespace Apache.Ignite.Core.Tests.Client
         {
             return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                Logger = new ListLogger(new ConsoleLogger()),
+                Logger = new ListLogger(new TestUtils.TestContextLogger()),
                 SpringConfigUrl = _enableSsl ? Path.Combine("Config", "Client", "server-with-ssl.xml") : null
             };
         }
@@ -244,7 +244,7 @@ namespace Apache.Ignite.Core.Tests.Client
             var listLogger = (ListLogger) logger;
             return listLogger.Entries;
         }
-        
+
         /// <summary>
         /// Gets client request names for a given server node.
         /// </summary>
@@ -253,7 +253,7 @@ namespace Apache.Ignite.Core.Tests.Client
             var instanceName = serverIndex == 0 ? null : serverIndex.ToString();
             var grid = Ignition.GetIgnite(instanceName);
             var logger = (ListLogger) grid.Logger;
-         
+
             return GetServerRequestNames(logger, prefix);
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cluster/ClientClusterDiscoveryTestsBase.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cluster/ClientClusterDiscoveryTestsBase.cs
index 8c81561..d40da60 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cluster/ClientClusterDiscoveryTestsBase.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Cluster/ClientClusterDiscoveryTestsBase.cs
@@ -78,7 +78,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cluster
                 AssertClientConnectionCount(client, 3);
             }
         }
-        
+
         /** <inheritdoc /> */
         protected override IgniteClientConfiguration GetClientConfiguration()
         {
@@ -97,7 +97,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cluster
                 AutoGenerateIgniteInstanceName = true
             };
         }
-        
+
         /// <summary>
         /// Asserts client connection count.
         /// </summary>
@@ -116,11 +116,11 @@ namespace Apache.Ignite.Core.Tests.Client.Cluster
                 }
 
                 return count == client.GetConnections().Count();
-            }, 1000);
+            }, 9000);
 
             if (!res)
             {
-                Assert.Fail("Client connection count mismatch: expected {0}, but was {1}", 
+                Assert.Fail("Client connection count mismatch: expected {0}, but was {1}",
                     count, client.GetConnections().Count());
             }
 
@@ -138,7 +138,7 @@ namespace Apache.Ignite.Core.Tests.Client.Cluster
                     .Select(a => a.Split('%').First())  // Trim IPv6 scope.
                     .Select(IPAddress.Parse)
                     .ToArray();
-                
+
                 CollectionAssert.Contains(ipAddresses, remoteEndPoint.Address);
 
                 var localEndPoint = (IPEndPoint) connection.LocalEndPoint;
@@ -146,4 +146,4 @@ namespace Apache.Ignite.Core.Tests.Client.Cluster
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientProtocolCompatibilityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientProtocolCompatibilityTest.cs
similarity index 98%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientProtocolCompatibilityTest.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientProtocolCompatibilityTest.cs
index fe9c073..c04a01f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientProtocolCompatibilityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientProtocolCompatibilityTest.cs
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-namespace Apache.Ignite.Core.Tests.Client
+namespace Apache.Ignite.Core.Tests.Client.Compatibility
 {
     using System;
     using System.Linq;
@@ -40,13 +40,13 @@ namespace Apache.Ignite.Core.Tests.Client
             [Values(0, 1, 2, 3, 4, 5, 6)] short minor)
         {
             var version = new ClientProtocolVersion(1, minor, 0);
-            
+
             using (var client = GetClient(version, true))
             {
                 var cache = client.GetOrCreateCache<int, int>(TestContext.CurrentContext.Test.Name);
                 cache.Put(1, -1);
                 cache.PutAll(Enumerable.Range(2, 10).ToDictionary(x => x, x => x));
-                
+
                 Assert.AreEqual(-1, cache.Get(1));
                 Assert.AreEqual(11, cache.Query(new ScanQuery<int, int>()).GetAll().Count);
             }
@@ -60,7 +60,7 @@ namespace Apache.Ignite.Core.Tests.Client
             [Values(0, 1, 2, 3, 4)] short minor)
         {
             var version = new ClientProtocolVersion(1, minor, 0);
-            
+
             using (var client = GetClient(version))
             {
                 TestClusterOperationsThrowCorrectExceptionOnVersionsOlderThan150(client, version.ToString());
@@ -75,7 +75,7 @@ namespace Apache.Ignite.Core.Tests.Client
             [Values(0, 1, 2, 3, 4, 5, 6)] short minor)
         {
             var version = new ClientProtocolVersion(1, minor, 0);
-            
+
             using (var client = GetClient(version))
             {
                 var compute = client.GetCompute();
@@ -95,11 +95,11 @@ namespace Apache.Ignite.Core.Tests.Client
             [Values(0, 1, 2, 3)] short minor)
         {
             var version = new ClientProtocolVersion(1, minor, 0);
-            
+
             using (var client = GetClient(version, true))
             {
                 Assert.IsFalse(client.GetConfiguration().EnablePartitionAwareness);
-                
+
                 var cache = client.GetOrCreateCache<int, int>(TestContext.CurrentContext.Test.Name);
                 cache.Put(1, 2);
                 Assert.AreEqual(2, cache.Get(1));
@@ -109,7 +109,7 @@ namespace Apache.Ignite.Core.Tests.Client
                 var expectedMessage = string.Format(
                     "Partition awareness has been disabled: server protocol version " +
                     "{0} is lower than required 1.4.0", version);
-                
+
                 Assert.IsNotNull(log);
                 Assert.AreEqual(expectedMessage, log.Message);
                 Assert.AreEqual(LogLevel.Warn, log.Level);
@@ -158,7 +158,7 @@ namespace Apache.Ignite.Core.Tests.Client
                 var lastLog = GetLogs(client).Last(e => e.Level == LogLevel.Debug);
                 var expectedLog = string.Format(
                     "Handshake completed on 127.0.0.1:10800, protocol version = {0}", version);
-                
+
                 Assert.AreEqual(expectedLog, lastLog.Message);
                 Assert.AreEqual(LogLevel.Debug, lastLog.Level);
                 Assert.AreEqual(typeof(ClientSocket).Name, lastLog.Category);
@@ -179,7 +179,7 @@ namespace Apache.Ignite.Core.Tests.Client
             AssertNotSupportedOperation(() => cluster.EnableWal("c"), version, "ClusterChangeWalState");
             AssertNotSupportedOperation(() => cluster.DisableWal("c"), version, "ClusterChangeWalState");
         }
-        
+
         /// <summary>
         /// Asserts proper exception for non-supported operation.
         /// </summary>
@@ -187,7 +187,7 @@ namespace Apache.Ignite.Core.Tests.Client
             string expectedOperationName)
         {
             var ex = Assert.Throws<IgniteClientException>(() => action());
-            
+
             var expectedMessage = string.Format(
                 "Operation {0} is not supported by protocol version {1}. " +
                 "Minimum protocol version required is 1.5.0.",
@@ -202,7 +202,7 @@ namespace Apache.Ignite.Core.Tests.Client
         internal static void AssertNotSupportedFeatureOperation(Action action, ClientBitmaskFeature feature, ClientOp op)
         {
             var ex = Assert.Throws<IgniteClientException>(() => action());
-            
+
             var expectedMessage = string.Format(
                 "Operation {0} is not supported by the server. " +
                 "Feature {1} is missing.",
@@ -240,4 +240,4 @@ namespace Apache.Ignite.Core.Tests.Client
             };
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientReconnectCompatibilityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientReconnectCompatibilityTest.cs
similarity index 96%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientReconnectCompatibilityTest.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientReconnectCompatibilityTest.cs
index 742f59a..635371a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientReconnectCompatibilityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientReconnectCompatibilityTest.cs
@@ -15,7 +15,8 @@
  * limitations under the License.
  */
 
-namespace Apache.Ignite.Core.Tests.Client
+#if !NETCOREAPP
+namespace Apache.Ignite.Core.Tests.Client.Compatibility
 {
     using System;
     using System.Linq;
@@ -28,7 +29,7 @@ namespace Apache.Ignite.Core.Tests.Client
     /// <summary>
     /// Tests thin client compatibility with reconnect.
     /// </summary>
-    [Category(TestUtils.CategoryIntensive)]    
+    [Category(TestUtils.CategoryIntensive)]
     public class ClientReconnectCompatibilityTest
     {
         /// <summary>
@@ -43,7 +44,7 @@ namespace Apache.Ignite.Core.Tests.Client
                 EnablePartitionAwareness = true,
                 Logger = new ListLogger(new ConsoleLogger {MinLevel = LogLevel.Trace})
             };
-            
+
             try
             {
                 using (StartNewServer())
@@ -105,4 +106,5 @@ namespace Apache.Ignite.Core.Tests.Client
             return JavaServer.Start(JavaServer.GroupIdIgnite, "2.4.0");
         }
     }
-}
\ No newline at end of file
+}
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientServerCompatibilityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientServerCompatibilityTest.cs
similarity index 96%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientServerCompatibilityTest.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientServerCompatibilityTest.cs
index fbeec4b..4f3f863 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/ClientServerCompatibilityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compatibility/ClientServerCompatibilityTest.cs
@@ -15,7 +15,8 @@
  * limitations under the License.
  */
 
-namespace Apache.Ignite.Core.Tests.Client
+#if !NETCOREAPP
+namespace Apache.Ignite.Core.Tests.Client.Compatibility
 {
     using System;
     using System.Threading;
@@ -45,10 +46,10 @@ namespace Apache.Ignite.Core.Tests.Client
     {
         /** */
         private readonly string _groupId;
-        
+
         /** */
         private readonly string _serverVersion;
-        
+
         /** */
         private readonly ClientProtocolVersion _clientProtocolVersion;
 
@@ -107,14 +108,14 @@ namespace Apache.Ignite.Core.Tests.Client
             {
                 return;
             }
-            
+
             using (var client = StartClient())
             {
                 ClientProtocolCompatibilityTest.TestClusterOperationsThrowCorrectExceptionOnVersionsOlderThan150(
                     client, _clientProtocolVersion.ToString());
             }
         }
-        
+
         /// <summary>
         /// Tests that cluster group operations throw proper exception on older server versions.
         /// </summary>
@@ -125,12 +126,12 @@ namespace Apache.Ignite.Core.Tests.Client
             {
                 // ReSharper disable once AccessToDisposedClosure
                 ClientProtocolCompatibilityTest.AssertNotSupportedFeatureOperation(
-                    () => client.GetCluster().ForServers().GetNodes(), 
-                    ClientBitmaskFeature.ClusterGroups, 
+                    () => client.GetCluster().ForServers().GetNodes(),
+                    ClientBitmaskFeature.ClusterGroups,
                     ClientOp.ClusterGroupGetNodeIds);
             }
         }
-        
+
         /// <summary>
         /// Tests that compute operations throw proper exception on older server versions.
         /// </summary>
@@ -141,12 +142,12 @@ namespace Apache.Ignite.Core.Tests.Client
             {
                 // ReSharper disable once AccessToDisposedClosure
                 ClientProtocolCompatibilityTest.AssertNotSupportedFeatureOperation(
-                    () => client.GetCompute().ExecuteJavaTask<int>("t", null), 
-                    ClientBitmaskFeature.ExecuteTaskByName, 
+                    () => client.GetCompute().ExecuteJavaTask<int>("t", null),
+                    ClientBitmaskFeature.ExecuteTaskByName,
                     ClientOp.ComputeTaskExecute);
             }
         }
-        
+
         /// <summary>
         /// Tests that partition awareness disables automatically on older server versions.
         /// </summary>
@@ -157,13 +158,13 @@ namespace Apache.Ignite.Core.Tests.Client
             {
                 var expectedPartitionAwareness = _clientProtocolVersion >= ClientSocket.Ver140;
                 Assert.AreEqual(expectedPartitionAwareness, client.GetConfiguration().EnablePartitionAwareness);
-                
+
                 var cache = client.GetOrCreateCache<int, int>(TestContext.CurrentContext.Test.Name);
                 cache.Put(1, 2);
                 Assert.AreEqual(2, cache.Get(1));
             }
         }
-        
+
         /// <summary>
         /// Tests that WithExpiryPolicy throws proper exception on older server versions.
         /// </summary>
@@ -174,7 +175,7 @@ namespace Apache.Ignite.Core.Tests.Client
             {
                 return;
             }
-            
+
             using (var client = StartClient())
             {
                 var cache = client.GetOrCreateCache<int, int>(TestContext.CurrentContext.Test.Name);
@@ -194,17 +195,17 @@ namespace Apache.Ignite.Core.Tests.Client
             using (var client = StartClient())
             {
                 var cache = client.GetCache<int, int>("twoSecondCache");
-                
+
                 cache.Put(1, 2);
                 Assert.True(cache.ContainsKey(1));
-                
+
                 Thread.Sleep(TimeSpan.FromSeconds(2.1));
                 Assert.False(cache.ContainsKey(1));
             }
         }
 
         /// <summary>
-        /// Tests that CreateCache with all config properties customized works on all versions. 
+        /// Tests that CreateCache with all config properties customized works on all versions.
         /// </summary>
         [Test]
         public void TestCreateCacheWithFullConfigWorksOnAllVersions()
@@ -212,9 +213,9 @@ namespace Apache.Ignite.Core.Tests.Client
             using (var client = StartClient())
             {
                 var cache = client.CreateCache<int, Person>(GetFullCacheConfiguration());
-                
+
                 cache.Put(1, new Person(2));
-                
+
                 Assert.AreEqual(2, cache.Get(1).Id);
                 Assert.AreEqual("Person 2", cache[1].Name);
             }
@@ -230,7 +231,7 @@ namespace Apache.Ignite.Core.Tests.Client
                 Logger = new ListLogger(new ConsoleLogger {MinLevel = LogLevel.Trace}),
                 EnablePartitionAwareness = true
             };
-            
+
             return Ignition.StartClient(cfg);
         }
 
@@ -263,7 +264,7 @@ namespace Apache.Ignite.Core.Tests.Client
                     {
                         Aliases = new[]
                         {
-                            new QueryAlias("Person.Name", "PName") 
+                            new QueryAlias("Person.Name", "PName")
                         }
                     }
                 },
@@ -290,7 +291,7 @@ namespace Apache.Ignite.Core.Tests.Client
                 SqlIndexMaxInlineSize = 200000
             };
         }
-        
+
         /** */
         private class TestExpiryPolicyFactory : IFactory<IExpiryPolicy>
         {
@@ -301,4 +302,5 @@ namespace Apache.Ignite.Core.Tests.Client
             }
         }
     }
-}
\ No newline at end of file
+}
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compute/ComputeClientTests.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compute/ComputeClientTests.cs
index 289468a..f46468e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compute/ComputeClientTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/Compute/ComputeClientTests.cs
@@ -139,8 +139,7 @@ namespace Apache.Ignite.Core.Tests.Client.Compute
                 var task = client.GetCompute().ExecuteJavaTaskAsync<object>(TestTask, (long) 10000);
                 ignite.Dispose();
 
-                var ex = Assert.Throws<AggregateException>(() => task.Wait()).GetInnermostException();
-                StringAssert.StartsWith("Task cancelled due to stopping of the grid", ex.Message);
+                Assert.Throws<AggregateException>(() => task.Wait());
             }
             finally
             {
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/IgniteClientConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/IgniteClientConfigurationTest.cs
index 001b075..5c39785 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/IgniteClientConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/IgniteClientConfigurationTest.cs
@@ -263,7 +263,7 @@ namespace Apache.Ignite.Core.Tests.Client
                 var ex = Assert.Throws<ConfigurationErrorsException>(() => Ignition.StartClient("foo", "bar"));
                 Assert.AreEqual("Specified config file does not exist: bar", ex.Message);
 
-#if !NETCOREAPP2_0 && !NETCOREAPP3_0  // Test runners do not pick up default config.
+#if !NETCOREAPP // Test runners do not pick up default config.
                 // Default section.
                 using (var client = Ignition.StartClient())
                 {
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/RawSecureSocketTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/RawSecureSocketTest.cs
index 379e7e3..5040453 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/RawSecureSocketTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Client/RawSecureSocketTest.cs
@@ -52,7 +52,11 @@ namespace Apache.Ignite.Core.Tests.Client
                 {
                     var certsCollection = new X509CertificateCollection(new X509Certificate[] {LoadCertificateFile()});
 
+#if !NETCOREAPP
                     sslStream.AuthenticateAsClient(host, certsCollection, SslProtocols.Tls, false);
+#else
+                    sslStream.AuthenticateAsClient(host, certsCollection, SslProtocols.Tls12, false);
+#endif
 
                     Assert.IsTrue(sslStream.IsAuthenticated);
                     Assert.IsTrue(sslStream.IsMutuallyAuthenticated);
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestFixtureSetUp.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Common/TestFixtureSetUp.cs
similarity index 100%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestFixtureSetUp.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Common/TestFixtureSetUp.cs
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestFixtureTearDown.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Common/TestFixtureTearDown.cs
similarity index 100%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/TestFixtureTearDown.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/Common/TestFixtureTearDown.cs
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
index f7d48cb..dc937f0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
@@ -80,13 +80,11 @@ namespace Apache.Ignite.Core.Tests.Compute
         [TestFixtureSetUp]
         public void InitClient()
         {
-            TestUtils.KillProcesses();
-
             if (_fork)
             {
-                Grid1 = Ignition.Start(GetConfiguration("config\\compute\\compute-standalone.xml"));
+                Grid1 = Ignition.Start(GetConfiguration("Config/Compute/compute-standalone.xml"));
 
-                _proc2 = Fork("config\\compute\\compute-standalone.xml");
+                _proc2 = Fork("Config/Compute/compute-standalone.xml");
 
                 while (true)
                 {
@@ -99,7 +97,7 @@ namespace Apache.Ignite.Core.Tests.Compute
                         break;
                 }
 
-                _proc3 = Fork("config\\compute\\compute-standalone.xml");
+                _proc3 = Fork("Config/Compute/compute-standalone.xml");
 
                 while (true)
                 {
@@ -114,9 +112,9 @@ namespace Apache.Ignite.Core.Tests.Compute
             }
             else
             {
-                Grid1 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid1.xml"));
-                _grid2 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid2.xml"));
-                _grid3 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid3.xml"));
+                Grid1 = Ignition.Start(GetConfiguration("Config/Compute/compute-grid1.xml"));
+                _grid2 = Ignition.Start(GetConfiguration("Config/Compute/compute-grid2.xml"));
+                _grid3 = Ignition.Start(GetConfiguration("Config/Compute/compute-grid3.xml"));
             }
         }
 
@@ -130,7 +128,11 @@ namespace Apache.Ignite.Core.Tests.Compute
         public void StopClient()
         {
             Ignition.StopAll(true);
-            IgniteProcess.KillAll();
+
+            if (_fork)
+            {
+                IgniteProcess.KillAll();
+            }
         }
 
         /// <summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/CancellationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/CancellationTest.cs
index 1a27538..3e85d49 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/CancellationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/CancellationTest.cs
@@ -34,7 +34,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         private const int MillisecondsTimeout = 50;
 
         public CancellationTest()
-            : base("config\\compute\\compute-grid1.xml", "config\\compute\\compute-grid2.xml")
+            : base("Config/Compute/compute-grid1.xml", "Config/Compute/compute-grid2.xml")
         {
             // No-op.
         }
@@ -81,7 +81,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             TestClosure((c, t) => c.CallAsync(new ComputeFunc(), t));
             TestClosure((c, t) => c.CallAsync(Enumerable.Range(1, 10).Select(x => new ComputeFunc()), t));
-            TestClosure((c, t) => c.CallAsync(Enumerable.Range(1, 10).Select(x => new ComputeFunc()), 
+            TestClosure((c, t) => c.CallAsync(Enumerable.Range(1, 10).Select(x => new ComputeFunc()),
                 new ComputeReducer(), t));
 
             TestClosure((c, t) => c.AffinityCallAsync("default", 0, new ComputeFunc(), t));
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.JavaTask.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.JavaTask.cs
index c0b1b16..9b794aa 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.JavaTask.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.JavaTask.cs
@@ -316,14 +316,12 @@ namespace Apache.Ignite.Core.Tests.Compute
 
                 Assert.AreEqual(val, binRes.GetField<long>("Field"));
 
-#if !NETCOREAPP
                 var dotNetBin = _grid1.GetBinary().ToBinary<BinaryObject>(res);
 
                 Assert.AreEqual(dotNetBin.Header.HashCode, ((BinaryObject)binRes).Header.HashCode);
 
                 Func<BinaryObject, byte[]> getData = bo => bo.Data.Skip(bo.Offset).Take(bo.Header.Length).ToArray();
                 Assert.AreEqual(getData(dotNetBin), getData((BinaryObject)binRes));
-#endif
             }
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
index 1e913db..db765ee 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
@@ -21,6 +21,7 @@ namespace Apache.Ignite.Core.Tests.Compute
     using System;
     using System.Collections.Concurrent;
     using System.Collections.Generic;
+    using System.IO;
     using System.Linq;
     using System.Net;
     using System.Threading;
@@ -69,9 +70,9 @@ namespace Apache.Ignite.Core.Tests.Compute
             _grid2 = Ignition.Start(Configuration(configs.Item2));
 
             AffinityTopologyVersion waitingTop = new AffinityTopologyVersion(2, 1);
-            
+
             Assert.True(_grid1.WaitTopology(waitingTop), "Failed to wait topology " + waitingTop);
-            
+
             _grid3 = Ignition.Start(Configuration(configs.Item3));
 
             // Start thin client.
@@ -83,12 +84,10 @@ namespace Apache.Ignite.Core.Tests.Compute
         /// </summary>
         protected virtual Tuple<string, string, string> GetConfigs()
         {
-            return Tuple.Create(
-                "Config\\Compute\\compute-grid1.xml",
-                "Config\\Compute\\compute-grid2.xml",
-                "Config\\Compute\\compute-grid3.xml");
-        }
+            var path = Path.Combine("Config", "Compute", "compute-grid");
 
+            return Tuple.Create(path + "1.xml", path + "2.xml", path + "3.xml");
+        }
 
         /// <summary>
         /// Gets the thin client configuration.
@@ -257,7 +256,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             var cluster = _grid1.GetCluster();
 
             Assert.IsTrue(cluster.GetNodes().Select(node => node.Id).All(cluster.PingNode));
-            
+
             Assert.IsFalse(cluster.PingNode(Guid.NewGuid()));
         }
 
@@ -268,7 +267,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         public void TestTopologyVersion()
         {
             var cluster = _grid1.GetCluster();
-            
+
             var topVer = cluster.TopologyVersion;
 
             Ignition.Stop(_grid3.Name, true);
@@ -314,7 +313,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
                 Assert.IsTrue(top.All(nodes.Contains));
             }
-            finally 
+            finally
             {
                 _grid2 = Ignition.Start(Configuration(GetConfigs().Item2));
             }
@@ -412,7 +411,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             var nodes = _grid1.GetCluster().GetNodes().Take(2).ToArray();
 
             var callCount = 0;
-            
+
             Func<IClusterNode, IClusterNode> nodeSelector = node =>
             {
                 callCount++;
@@ -428,7 +427,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             var projection = _grid1.GetCluster().ForNodes(nodes.Select(nodeSelector));
             Assert.AreEqual(2, projection.GetNodes().Count);
             Assert.AreEqual(2, callCount);
-            
+
             projection = _grid1.GetCluster().ForNodeIds(nodes.Select(idSelector));
             Assert.AreEqual(2, projection.GetNodes().Count);
             Assert.AreEqual(4, callCount);
@@ -583,7 +582,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             var nodeId = _grid1.GetCluster().ForAttribute("my_attr", "value1").GetNodes().Single().Id;
             Assert.AreEqual(nodeId, clientPrj.GetNode().Id);
         }
-        
+
         /// <summary>
         /// Test for cache/data/client projections.
         /// </summary>
@@ -599,7 +598,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             Assert.IsTrue(nodes.Contains(prjCache.GetNodes().ElementAt(0)));
             Assert.IsTrue(nodes.Contains(prjCache.GetNodes().ElementAt(1)));
-            
+
             // Data nodes.
             IClusterGroup prjData = _grid1.GetCluster().ForDataNodes("cache1");
 
@@ -770,7 +769,7 @@ namespace Apache.Ignite.Core.Tests.Compute
                     ReservedPartition = aff.GetPartition(primaryKey),
                     CacheNames = new[] {cacheName}
                 };
-                
+
                 _grid1.GetCompute().AffinityRun(cacheName, affinityKey, computeAction);
                 Assert.AreEqual(node.Id, ComputeAction.LastNodeId);
 
@@ -874,9 +873,9 @@ namespace Apache.Ignite.Core.Tests.Compute
             var node = local
                 ? _grid1.GetCluster().GetLocalNode()
                 : _grid2.GetCluster().GetLocalNode();
-            
+
             var aff = _grid1.GetAffinity(cacheNames[0]);
-            
+
             // Wait for some partitions to be assigned to the node.
             TestUtils.WaitForTrueCondition(() => aff.GetPrimaryPartitions(node).Any());
             var part = aff.GetPrimaryPartitions(node).First();
@@ -890,11 +889,11 @@ namespace Apache.Ignite.Core.Tests.Compute
             var action = async
                 ? (Action) (() => _grid1.GetCompute().AffinityRunAsync(cacheNames, part, computeAction).Wait())
                 : () => _grid1.GetCompute().AffinityRun(cacheNames, part, computeAction);
-            
+
             // Good case.
             action();
             Assert.AreEqual(node.Id, ComputeAction.LastNodeId);
-            
+
             // Exception in user code.
             computeAction.ShouldThrow = true;
             var aex = Assert.Throws<AggregateException>(() => action());
@@ -912,7 +911,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             [Values(true, false)] bool keyOrPart)
         {
             var compute = _grid1.GetCompute();
-            
+
             Action<CancellationToken> action = token =>
             {
                 if (callOrRun)
@@ -941,7 +940,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             // Not cancelled.
             Assert.DoesNotThrow(() => action(CancellationToken.None));
-            
+
             // Cancelled.
             var ex = Assert.Throws<AggregateException>(() => action(new CancellationToken(true)));
             Assert.IsInstanceOf<TaskCanceledException>(ex.GetInnermostException());
@@ -984,7 +983,7 @@ namespace Apache.Ignite.Core.Tests.Compute
                 _grid1.GetCluster().ForLocal().GetCompute().Broadcast(new ExceptionalComputeAction()));
 
             Assert.IsNotNull(ex.InnerException);
-            Assert.AreEqual("Compute job has failed on local node, examine InnerException for details.", 
+            Assert.AreEqual("Compute job has failed on local node, examine InnerException for details.",
                 ex.InnerException.Message);
             Assert.IsNotNull(ex.InnerException.InnerException);
             Assert.AreEqual(ExceptionalComputeAction.ErrorText, ex.InnerException.InnerException.Message);
@@ -1162,11 +1161,11 @@ namespace Apache.Ignite.Core.Tests.Compute
         public static Guid LastNodeId;
 
         public Guid Id { get; set; }
-        
+
         public int? ReservedPartition { get; set; }
-        
+
         public ICollection<string> CacheNames { get; set; }
-        
+
         public bool ShouldThrow { get; set; }
 
         public ComputeAction()
@@ -1237,7 +1236,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
     interface INestedComputeFunc : IComputeFunc<int>
     {
-        
+
     }
 
     [Serializable]
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeMultithreadedTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeMultithreadedTest.cs
index b03d4a4..697891a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeMultithreadedTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeMultithreadedTest.cs
@@ -30,6 +30,12 @@ namespace Apache.Ignite.Core.Tests.Compute
     public class ComputeMultithreadedTest : AbstractTaskTest
     {
         /** */
+        private const int Duration = 5;
+
+        /** */
+        private const int ThreadNum = 4;
+
+        /** */
         private static IList<Action<ICompute>> _actions;
 
         /// <summary>
@@ -68,7 +74,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         }
 
         /// <summary>
-        /// Test not-marshalable error occurred during map step.
+        /// Tests all task types in parallel.
         /// </summary>
         [Test]
         public void TestAllTaskTypeAtSameTime()
@@ -80,7 +86,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             TestUtils.RunMultiThreaded(() =>
             {
                 _actions[TestUtils.Random.Next(_actions.Count)](compute);
-            }, 4, 60);
+            }, ThreadNum, Duration * 2);
         }
 
         /// <summary>
@@ -91,7 +97,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             Assert.AreEqual(_actions.Count, 6);
 
-            TestUtils.RunMultiThreaded(() => _actions[0](Grid1.GetCompute()), 4, 20);
+            TestUtils.RunMultiThreaded(() => _actions[0](Grid1.GetCompute()), ThreadNum, Duration);
         }
 
         /// <summary>
@@ -102,7 +108,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             Assert.AreEqual(_actions.Count, 6);
 
-            TestUtils.RunMultiThreaded(() => _actions[1](Grid1.GetCompute()), 4, 20);
+            TestUtils.RunMultiThreaded(() => _actions[1](Grid1.GetCompute()), ThreadNum, Duration);
         }
 
         /// <summary>
@@ -113,7 +119,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             Assert.AreEqual(_actions.Count, 6);
 
-            TestUtils.RunMultiThreaded(() => _actions[2](Grid1.GetCompute()), 4, 20);
+            TestUtils.RunMultiThreaded(() => _actions[2](Grid1.GetCompute()), ThreadNum, Duration);
         }
 
         /// <summary>
@@ -124,7 +130,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             Assert.AreEqual(_actions.Count, 6);
 
-            TestUtils.RunMultiThreaded(() => _actions[3](Grid1.GetCompute()), 4, 20);
+            TestUtils.RunMultiThreaded(() => _actions[3](Grid1.GetCompute()), ThreadNum, Duration);
         }
         /// <summary>
         ///
@@ -134,7 +140,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             Assert.AreEqual(_actions.Count, 6);
 
-            TestUtils.RunMultiThreaded(() => _actions[4](Grid1.GetCompute()), 4, 20);
+            TestUtils.RunMultiThreaded(() => _actions[ThreadNum](Grid1.GetCompute()), ThreadNum, Duration);
         }
 
         /// <summary>
@@ -145,7 +151,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             Assert.AreEqual(_actions.Count, 6);
 
-            TestUtils.RunMultiThreaded(() => _actions[5](Grid1.GetCompute()), 4, 20);
+            TestUtils.RunMultiThreaded(() => _actions[5](Grid1.GetCompute()), ThreadNum, Duration);
         }
     }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Apache.Ignite.exe.config.test b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Apache.Ignite.exe.config.test
index c6aaa52..16b0a38 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Apache.Ignite.exe.config.test
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Apache.Ignite.exe.config.test
@@ -27,7 +27,7 @@
     </runtime>
 
     <appSettings>
-        <add key="Ignite.SpringConfigUrl" value="config\compute\compute-standalone.xml" />
+        <add key="Ignite.SpringConfigUrl" value="Config/Compute/compute-standalone.xml" />
         <add key="Ignite.Assembly.1" value="test-1.dll" />
         <add key="Ignite.Assembly.2" value="test-2.dll" />
         <add key="Ignite.JvmOption.1" value="-DOPT1" />
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/server.jks b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/server.jks
index 2632662..7007256 100644
Binary files a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/server.jks and b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/server.jks differ
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/thin-client-cert.pfx b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/thin-client-cert.pfx
index 2f5c12e..29efdce 100644
Binary files a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/thin-client-cert.pfx and b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/thin-client-cert.pfx differ
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/trust.jks b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/trust.jks
index a0f3bcf..e363af2 100644
Binary files a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/trust.jks and b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Client/trust.jks differ
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs
index 5bc3b07..8b5f6d8 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs
@@ -78,7 +78,12 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestStartupOutput()
         {
-            using (Ignition.Start(TestUtils.GetTestConfiguration()))
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                Logger = null
+            };
+            
+            using (Ignition.Start(cfg))
             {
                 Assert.AreEqual(1, Regex.Matches(_outSb.ToString(), "ver=1, locNode=[a-fA-F0-9]{8,8}, servers=1, clients=0,").Count);
             }
@@ -109,12 +114,14 @@ namespace Apache.Ignite.Core.Tests
                     CommunicationSpi = new TcpCommunicationSpi
                     {
                         IdleConnectionTimeout = TimeSpan.MinValue
-                    }
+                    },
+                    Logger = null
                 }));
 
-            Assert.IsTrue(_errSb.ToString().Contains("SPI parameter failed condition check: idleConnTimeout > 0"));
+            StringAssert.Contains("SPI parameter failed condition check: idleConnTimeout > 0", _errSb.ToString());
         }
 
+#if !NETCOREAPP
         /// <summary>
         /// Tests the disabled redirect.
         /// </summary>
@@ -126,7 +133,11 @@ namespace Apache.Ignite.Core.Tests
 
             if (Environment.GetEnvironmentVariable(envVar) == bool.TrueString)
             {
-                var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration(false));
+                var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration(false))
+                {
+                    Logger = null
+                };
+                
                 Assert.IsTrue(cfg.RedirectJavaConsoleOutput);
 
                 cfg.RedirectJavaConsoleOutput = false;
@@ -152,7 +163,12 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestMultipleDomains()
         {
-            using (var ignite = Ignition.Start(TestUtils.GetTestConfiguration()))
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                Logger = null
+            };
+            
+            using (var ignite = Ignition.Start(cfg))
             {
                 Assert.AreEqual(1, Regex.Matches(_outSb.ToString(), "ver=1, locNode=[a-fA-F0-9]{8,8}, servers=1, clients=0,").Count);
 
@@ -218,12 +234,14 @@ namespace Apache.Ignite.Core.Tests
             {
                 Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
                 {
-                    IgniteInstanceName = "newDomainGrid"
+                    IgniteInstanceName = "newDomainGrid",
+                    Logger = null
                 });
 
                 // Will be stopped automatically on domain unload.
             }
         }
+#endif
 
         private class MyStringWriter : StringWriter
         {
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
index 949643f..5004c03 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP
 namespace Apache.Ignite.Core.Tests
 {
     using System;
@@ -135,7 +136,7 @@ namespace Apache.Ignite.Core.Tests
             DeployTo(dllFolder, jarFolder);
 
             // Copy config
-            var springPath = Path.GetFullPath("config\\compute\\compute-grid2.xml");
+            var springPath = Path.GetFullPath("Config/Compute/compute-grid2.xml");
             var springFile = Path.GetFileName(springPath);
             File.Copy(springPath, Path.Combine(dllFolder, springFile));
 
@@ -210,7 +211,7 @@ namespace Apache.Ignite.Core.Tests
         {
             using (var ignite = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = "config\\compute\\compute-grid1.xml",
+                SpringConfigUrl = "Config/Compute/compute-grid1.xml",
             }))
             {
                 Assert.IsTrue(ignite.WaitTopology(2));
@@ -243,3 +244,4 @@ namespace Apache.Ignite.Core.Tests
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
index 2bf0a73..b9949ef 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
@@ -116,7 +116,7 @@ namespace Apache.Ignite.Core.Tests
             var events = _grid1.GetEvents();
 
             Assert.AreEqual(0, events.GetEnabledEvents().Count);
-            
+
             Assert.IsFalse(EventType.CacheAll.Any(events.IsEnabled));
 
             events.EnableLocal(EventType.CacheAll);
@@ -199,7 +199,7 @@ namespace Apache.Ignite.Core.Tests
             events.StopLocalListen(listener, eventType);
 
             CheckSend(3);
-            
+
             events.StopLocalListen(listener, eventType);
 
             CheckNoEvent();
@@ -241,7 +241,7 @@ namespace Apache.Ignite.Core.Tests
         /// <summary>
         /// Test cases for TestEventTypes: type id + type + event generator.
         /// </summary>
-        public IEnumerable<EventTestCase> TestCases
+        public static IEnumerable<EventTestCase> TestCases
         {
             get
             {
@@ -270,7 +270,7 @@ namespace Apache.Ignite.Core.Tests
                     GenerateEvent = g => GenerateTaskEvent(g),
                     EventCount = 7
                 };
-                
+
                 yield return new EventTestCase
                 {
                     EventType = new[] {EventType.CacheQueryExecuted},
@@ -407,7 +407,7 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestWaitForLocalOverloads()
         {
-            
+
         }
 
         /*
@@ -416,7 +416,7 @@ namespace Apache.Ignite.Core.Tests
         /// </summary>
         [Test]
         public void TestRemoteListen(
-            [Values(true, false)] bool async, 
+            [Values(true, false)] bool async,
             [Values(true, false)] bool binarizable,
             [Values(true, false)] bool autoUnsubscribe)
         {
@@ -430,7 +430,7 @@ namespace Apache.Ignite.Core.Tests
 
             var expectedType = EventType.JobStarted;
 
-            var remoteFilter = binary 
+            var remoteFilter = binary
                 ?  (IEventFilter<IEvent>) new RemoteEventBinarizableFilter(expectedType)
                 :  new RemoteEventFilter(expectedType);
 
@@ -493,8 +493,8 @@ namespace Apache.Ignite.Core.Tests
 
             GenerateTaskEvent();
 
-            var remoteQuery = !async 
-                ? events.RemoteQuery(eventFilter, EventsTestHelper.Timeout, EventType.JobExecutionAll) 
+            var remoteQuery = !async
+                ? events.RemoteQuery(eventFilter, EventsTestHelper.Timeout, EventType.JobExecutionAll)
                 : events.RemoteQueryAsync(eventFilter, EventsTestHelper.Timeout, EventType.JobExecutionAll).Result;
 
             var qryResult = remoteQuery.Except(oldEvents).Cast<JobEvent>().ToList();
@@ -654,9 +654,9 @@ namespace Apache.Ignite.Core.Tests
             Assert.AreEqual(locNode, evt.Node);
             Assert.AreEqual("msg", evt.Message);
             Assert.AreEqual(EventType.NodeFailed, evt.Type);
-            Assert.IsNotNullOrEmpty(evt.Name);
+            Assert.IsNotEmpty(evt.Name);
             Assert.AreNotEqual(Guid.Empty, evt.Id.GlobalId);
-            Assert.IsTrue(Math.Abs((evt.Timestamp - DateTime.UtcNow).TotalSeconds) < 20, 
+            Assert.IsTrue(Math.Abs((evt.Timestamp - DateTime.UtcNow).TotalSeconds) < 20,
                 "Invalid event timestamp: '{0}', current time: '{1}'", evt.Timestamp, DateTime.Now);
 
             Assert.Greater(evt.LocalOrder, 0);
@@ -713,9 +713,17 @@ namespace Apache.Ignite.Core.Tests
         /// <summary>
         /// Generates the task event.
         /// </summary>
-        private void GenerateTaskEvent(IIgnite grid = null)
+        private void GenerateTaskEvent()
         {
-            (grid ?? _grid1).GetCompute().Broadcast(new ComputeAction());
+            _grid1.GetCompute().Broadcast(new ComputeAction());
+        }
+
+        /// <summary>
+        /// Generates the task event.
+        /// </summary>
+        private static void GenerateTaskEvent(IIgnite grid)
+        {
+            grid.GetCompute().Broadcast(new ComputeAction());
         }
 
         /// <summary>
@@ -807,7 +815,7 @@ namespace Apache.Ignite.Core.Tests
         {
             _grid1 = _grid2 = _grid3 = null;
             _grids = null;
-            
+
             Ignition.StopAll(true);
         }
     }
@@ -820,7 +828,7 @@ namespace Apache.Ignite.Core.Tests
     {
         /** */
         public static readonly ConcurrentStack<IEvent> ReceivedEvents = new ConcurrentStack<IEvent>();
-        
+
         /** */
         public static readonly ConcurrentStack<string> Failures = new ConcurrentStack<string>();
 
@@ -853,9 +861,9 @@ namespace Apache.Ignite.Core.Tests
         public static void VerifyReceive(int count, Type eventObjectType, ICollection<int> eventTypes)
         {
             // check if expected event count has been received; Wait returns false if there were none.
-            Assert.IsTrue(ReceivedEvent.Wait(Timeout), 
+            Assert.IsTrue(ReceivedEvent.Wait(Timeout),
                 "Failed to receive expected number of events. Remaining count: " + ReceivedEvent.CurrentCount);
-            
+
             Assert.AreEqual(count, ReceivedEvents.Count);
 
             Assert.IsTrue(ReceivedEvents.All(x => x.GetType() == eventObjectType));
@@ -885,7 +893,7 @@ namespace Apache.Ignite.Core.Tests
                 if (Failures.Any())
                     Assert.Fail(Failures.Reverse().Aggregate((x, y) => string.Format("{0}\n{1}", x, y)));
             }
-            finally 
+            finally
             {
                 Failures.Clear();
             }
@@ -903,12 +911,12 @@ namespace Apache.Ignite.Core.Tests
                 ReceivedEvents.Push(evt);
 
                 ReceivedEvent.Signal();
-                
+
                 return ListenResult;
             }
             catch (Exception ex)
             {
-                // When executed on remote nodes, these exceptions will not go to sender, 
+                // When executed on remote nodes, these exceptions will not go to sender,
                 // so we have to accumulate them.
                 Failures.Push(string.Format("Exception in Listen (msg: {0}, id: {1}): {2}", evt, evt.Node.Id, ex));
                 throw;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/PathUtil.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/PathUtil.cs
index 969b28b..d5c6604 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/PathUtil.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/PathUtil.cs
@@ -28,7 +28,7 @@ namespace Apache.Ignite.Core.Tests.Examples
         public const string DevPrefix = "modules\\";
 
         /** */
-        public static readonly string IgniteHome = Core.Impl.Common.IgniteHome.Resolve();
+        public static readonly string IgniteHome = Impl.Common.IgniteHome.Resolve();
 
         /// <summary>
         /// Examples source code path.
@@ -53,4 +53,4 @@ namespace Apache.Ignite.Core.Tests.Examples
             return Path.GetFullPath(Path.Combine(IgniteHome, DevPrefix + springConfigUrl));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
index 5e84823..5319ef6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
@@ -42,15 +42,6 @@ namespace Apache.Ignite.Core.Tests
         private const string ExceptionTask = "org.apache.ignite.platform.PlatformExceptionTask";
 
         /// <summary>
-        /// Before test.
-        /// </summary>
-        [SetUp]
-        public void SetUp()
-        {
-            TestUtils.KillProcesses();
-        }
-
-        /// <summary>
         /// After test.
         /// </summary>
         [TearDown]
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
index 9e050ec..440b019 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP
 // ReSharper disable UnusedVariable
 // ReSharper disable UnusedAutoPropertyAccessor.Global
 // ReSharper disable UnusedAutoPropertyAccessor.Local
@@ -39,7 +40,7 @@ namespace Apache.Ignite.Core.Tests
     public class ExecutableTest
     {
         /** Spring configuration path. */
-        private const string SpringCfgPath = "config\\compute\\compute-standalone.xml";
+        private const string SpringCfgPath = "Config/Compute/compute-standalone.xml";
 
         /** Min memory Java task. */
         private const string MinMemTask = "org.apache.ignite.platform.PlatformMinMemoryTask";
@@ -127,7 +128,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// Test assemblies passing through command-line. 
+        /// Test assemblies passing through command-line.
         /// </summary>
         [Test]
         public void TestAssemblyCmd()
@@ -150,7 +151,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// Test JVM options passing through command-line. 
+        /// Test JVM options passing through command-line.
         /// </summary>
         [Test]
         public void TestJvmOptsCmd()
@@ -553,3 +554,4 @@ namespace Apache.Ignite.Core.Tests
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSectionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSectionTest.cs
index 4b88fc4..913cf4a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSectionTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSectionTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP
 namespace Apache.Ignite.Core.Tests
 {
     using System.Configuration;
@@ -83,7 +84,7 @@ namespace Apache.Ignite.Core.Tests
             var ex = Assert.Throws<ConfigurationErrorsException>(() =>
                 Ignition.StartFromApplicationConfiguration("igniteConfiguration111"));
 
-            Assert.AreEqual("Could not find IgniteConfigurationSection with name 'igniteConfiguration111'", 
+            Assert.AreEqual("Could not find IgniteConfigurationSection with name 'igniteConfiguration111'",
                 ex.Message);
 
 
@@ -108,8 +109,8 @@ namespace Apache.Ignite.Core.Tests
 
             Assert.AreEqual("Could not find IgniteConfigurationSection with name 'igniteConfiguration' " +
                             "in file 'custom_app.config'", ex.Message);
-            
-            
+
+
             // Missing section body in custom file.
             ex = Assert.Throws<ConfigurationErrorsException>(() =>
                 Ignition.StartFromApplicationConfiguration("igniteConfigurationMissing", "custom_app.config"));
@@ -120,3 +121,4 @@ namespace Apache.Ignite.Core.Tests
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
index bffe94a..7941175 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
@@ -17,6 +17,7 @@
 
 // ReSharper disable UnusedAutoPropertyAccessor.Global
 // ReSharper disable MemberCanBePrivate.Global
+// ReSharper disable NonReadonlyMemberInGetHashCode
 #pragma warning disable 618
 namespace Apache.Ignite.Core.Tests
 {
@@ -55,7 +56,6 @@ namespace Apache.Ignite.Core.Tests
     using Apache.Ignite.Core.Tests.Binary;
     using Apache.Ignite.Core.Tests.Plugin;
     using Apache.Ignite.Core.Transactions;
-    using Apache.Ignite.NLog;
     using NUnit.Framework;
     using CheckpointWriteOrder = Apache.Ignite.Core.PersistentStore.CheckpointWriteOrder;
     using DataPageEvictionMode = Apache.Ignite.Core.Cache.Configuration.DataPageEvictionMode;
@@ -72,7 +72,7 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestPredefinedXml()
         {
-            var xml = File.ReadAllText("Config\\full-config.xml");
+            var xml = File.ReadAllText(Path.Combine("Config", "full-config.xml"));
 
             var cfg = IgniteConfiguration.FromXml(xml);
 
@@ -124,7 +124,7 @@ namespace Apache.Ignite.Core.Tests
             Assert.IsFalse(cacheCfg.WriteBehindCoalescing);
             Assert.AreEqual(PartitionLossPolicy.ReadWriteAll, cacheCfg.PartitionLossPolicy);
             Assert.AreEqual("fooGroup", cacheCfg.GroupName);
-            
+
             Assert.AreEqual("bar", cacheCfg.KeyConfiguration.Single().AffinityKeyFieldName);
             Assert.AreEqual("foo", cacheCfg.KeyConfiguration.Single().TypeName);
 
@@ -175,7 +175,7 @@ namespace Apache.Ignite.Core.Tests
             Assert.IsNotNull(af);
             Assert.AreEqual(99, af.Partitions);
             Assert.IsTrue(af.ExcludeNeighbors);
-            
+
             var platformCacheConfiguration = cacheCfg.PlatformCacheConfiguration;
             Assert.AreEqual("int", platformCacheConfiguration.KeyTypeName);
             Assert.AreEqual("string", platformCacheConfiguration.ValueTypeName);
@@ -359,12 +359,12 @@ namespace Apache.Ignite.Core.Tests
             Assert.IsFalse(dr.MetricsEnabled);
 
             Assert.IsInstanceOf<SslContextFactory>(cfg.SslContextFactory);
-            
+
             Assert.IsInstanceOf<StopNodeOrHaltFailureHandler>(cfg.FailureHandler);
 
             var failureHandler = (StopNodeOrHaltFailureHandler)cfg.FailureHandler;
-            
-            Assert.IsTrue(failureHandler.TryStop);  
+
+            Assert.IsTrue(failureHandler.TryStop);
             Assert.AreEqual(TimeSpan.Parse("0:1:0"), failureHandler.Timeout);
 
             var ec = cfg.ExecutorConfiguration;
@@ -385,7 +385,7 @@ namespace Apache.Ignite.Core.Tests
 
             // Test custom with different culture to make sure numbers are serialized properly
             RunWithCustomCulture(() => CheckSerializeDeserialize(GetTestConfig()));
-            
+
             // Test default
             CheckSerializeDeserialize(new IgniteConfiguration());
         }
@@ -396,7 +396,7 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestAllPropertiesArePresentInSchema()
         {
-            CheckAllPropertiesArePresentInSchema("IgniteConfigurationSection.xsd", "igniteConfiguration", 
+            CheckAllPropertiesArePresentInSchema("IgniteConfigurationSection.xsd", "igniteConfiguration",
                 typeof(IgniteConfiguration));
         }
 
@@ -478,8 +478,9 @@ namespace Apache.Ignite.Core.Tests
         public void TestToXml()
         {
             // Empty config
-            Assert.AreEqual("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<igniteConfiguration " +
-                            "xmlns=\"http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection\" />",
+            Assert.AreEqual(
+                "<?xml version=\"1.0\" encoding=\"utf-16\"?>" + Environment.NewLine +
+                "<igniteConfiguration xmlns=\"http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection\" />",
                 new IgniteConfiguration().ToXml());
 
             // Some properties
@@ -594,7 +595,7 @@ namespace Apache.Ignite.Core.Tests
         private static string FixLineEndings(string s)
         {
             return s.Split('\n').Select(x => x.TrimEnd('\r'))
-                .Aggregate((acc, x) => string.Format("{0}\r\n{1}", acc, x));
+                .Aggregate((acc, x) => string.Format("{0}{1}{2}", acc, Environment.NewLine, x));
         }
 
         /// <summary>
@@ -794,7 +795,7 @@ namespace Apache.Ignite.Core.Tests
                             {
                                 AffinityKeyFieldName = "abc",
                                 TypeName = "def"
-                            }, 
+                            },
                         },
                         OnheapCacheEnabled = true,
                         StoreConcurrentLoadAllThreshold = 7,
@@ -888,7 +889,7 @@ namespace Apache.Ignite.Core.Tests
                     UnacknowledgedMessagesBufferSize = 3450
                 },
                 SpringConfigUrl = "test",
-                Logger = new IgniteNLogLogger(),
+                Logger = new ConsoleLogger(),
                 FailureDetectionTimeout = TimeSpan.FromMinutes(2),
                 ClientFailureDetectionTimeout = TimeSpan.FromMinutes(3),
                 LongQueryWarningTimeout = TimeSpan.FromDays(4),
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
index 4ecf363..b34ce8d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+// ReSharper disable NonReadonlyMemberInGetHashCode
 #pragma warning disable 618  // Ignore obsolete, we still need to test them.
 namespace Apache.Ignite.Core.Tests
 {
@@ -136,7 +137,7 @@ namespace Apache.Ignite.Core.Tests
 
                 var enc = (KeystoreEncryptionSpi) cfg.EncryptionSpi;
                 var resEnc = (KeystoreEncryptionSpi) resCfg.EncryptionSpi;
-                
+
                 Assert.AreEqual(enc.MasterKeyName, resEnc.MasterKeyName);
                 Assert.AreEqual(enc.KeySize, resEnc.KeySize);
                 Assert.AreEqual(enc.KeyStorePath, resEnc.KeyStorePath);
@@ -208,7 +209,7 @@ namespace Apache.Ignite.Core.Tests
                 Assert.AreEqual(com.TcpNoDelay, resCom.TcpNoDelay);
                 Assert.AreEqual(com.UnacknowledgedMessagesBufferSize, resCom.UnacknowledgedMessagesBufferSize);
                 Assert.AreEqual(com.UsePairedConnections, resCom.UsePairedConnections);
-                
+
                 Assert.AreEqual(cfg.FailureDetectionTimeout, resCfg.FailureDetectionTimeout);
                 Assert.AreEqual(cfg.SystemWorkerBlockedTimeout, resCfg.SystemWorkerBlockedTimeout);
                 Assert.AreEqual(cfg.ClientFailureDetectionTimeout, resCfg.ClientFailureDetectionTimeout);
@@ -518,7 +519,7 @@ namespace Apache.Ignite.Core.Tests
             Assert.AreEqual(IgniteConfiguration.DefaultLongQueryWarningTimeout, cfg.LongQueryWarningTimeout);
             Assert.AreEqual(IgniteConfiguration.DefaultIsLateAffinityAssignment, cfg.IsLateAffinityAssignment);
             Assert.AreEqual(IgniteConfiguration.DefaultIsActiveOnStart, cfg.IsActiveOnStart);
-            Assert.AreEqual(IgniteConfiguration.DefaultClientConnectorConfigurationEnabled, 
+            Assert.AreEqual(IgniteConfiguration.DefaultClientConnectorConfigurationEnabled,
                 cfg.ClientConnectorConfigurationEnabled);
             Assert.AreEqual(IgniteConfiguration.DefaultRedirectJavaConsoleOutput, cfg.RedirectJavaConsoleOutput);
             Assert.AreEqual(IgniteConfiguration.DefaultAuthenticationEnabled, cfg.AuthenticationEnabled);
@@ -595,7 +596,7 @@ namespace Apache.Ignite.Core.Tests
             Assert.AreEqual(DataStorageConfiguration.DefaultSystemRegionMaxSize, cfg.SystemRegionMaxSize);
             Assert.AreEqual(DataStorageConfiguration.DefaultPageSize, cfg.PageSize);
             Assert.AreEqual(DataStorageConfiguration.DefaultConcurrencyLevel, cfg.ConcurrencyLevel);
-            Assert.AreEqual(DataStorageConfiguration.DefaultWalAutoArchiveAfterInactivity, 
+            Assert.AreEqual(DataStorageConfiguration.DefaultWalAutoArchiveAfterInactivity,
                 cfg.WalAutoArchiveAfterInactivity);
         }
 
@@ -762,7 +763,7 @@ namespace Apache.Ignite.Core.Tests
                     SlowClientQueueLimit = 98,
                     SocketSendBufferSize = 2045,
                     UnacknowledgedMessagesBufferSize = 3450,
-                    ConnectionsPerNode = 12, 
+                    ConnectionsPerNode = 12,
                     UsePairedConnections = true,
                     SharedMemoryPort = 1234,
                     SocketWriteTimeout = 2222,
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteLockTests.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteLockTests.cs
index f66e543..3ae8453 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteLockTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteLockTests.cs
@@ -276,7 +276,7 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestFairLockGuaranteesOrder()
         {
-            const int count = 50;
+            const int count = 20;
 
             var cfg = new LockConfiguration
             {
@@ -309,7 +309,7 @@ namespace Apache.Ignite.Core.Tests
 
                 evt.WaitOne();
 
-                Thread.Sleep(50);
+                Thread.Sleep(100);
 
                 threads[i] = thread;
             }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopProcessorInitTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopProcessorInitTest.cs
new file mode 100644
index 0000000..62f7756
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopProcessorInitTest.cs
@@ -0,0 +1,113 @@
+/*
+ * 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.
+ */
+
+#if !NETCOREAPP
+namespace Apache.Ignite.Core.Tests
+{
+    using System;
+    using System.IO;
+    using System.Threading;
+    using Apache.Ignite.Core.Impl.Common;
+    using Apache.Ignite.Core.Messaging;
+    using Apache.Ignite.Core.Tests.Process;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Ignite start/stop tests.
+    /// </summary>
+    [Category(TestUtils.CategoryIntensive)]
+    public class IgniteStartStopProcessorInitTest
+    {
+        /// <summary>
+        /// Test teardown.
+        /// </summary>
+        [TearDown]
+        public void TearDown()
+        {
+            TestUtils.KillProcesses();
+            Ignition.StopAll(true);
+        }
+
+        /// <summary>
+        /// Tests the processor initialization and grid usage right after topology enter.
+        /// </summary>
+        [Test]
+        public void TestProcessorInit()
+        {
+            var cfg = new IgniteConfiguration
+            {
+                SpringConfigUrl = "Config\\spring-test.xml",
+                JvmOptions = TestUtils.TestJavaOptions(),
+                JvmClasspath = TestUtils.CreateTestClasspath()
+            };
+
+            // Start local node
+            var grid = Ignition.Start(cfg);
+
+            // Start remote node in a separate process
+            // ReSharper disable once UnusedVariable
+            var proc = new IgniteProcess(
+                "-springConfigUrl=" + Path.GetFullPath(cfg.SpringConfigUrl),
+                "-J-Xms512m",
+                "-J-Xmx512m");
+
+            Assert.IsTrue(proc.Alive);
+
+            var cts = new CancellationTokenSource();
+            var token = cts.Token;
+
+            // Spam message subscriptions on a separate thread
+            // to test race conditions during processor init on remote node
+            var listenTask = TaskRunner.Run(() =>
+            {
+                var filter = new MessageListener();
+
+                while (!token.IsCancellationRequested)
+                {
+                    var listenId = grid.GetMessaging().RemoteListen(filter);
+
+                    grid.GetMessaging().StopRemoteListen(listenId);
+                }
+                // ReSharper disable once FunctionNeverReturns
+            });
+
+            // Wait for remote node to join
+            Assert.IsTrue(grid.WaitTopology(2));
+
+            // Wait some more for initialization
+            Thread.Sleep(1000);
+
+            // Cancel listen task and check that it finishes
+            cts.Cancel();
+            Assert.IsTrue(listenTask.Wait(5000));
+        }
+
+        /// <summary>
+        /// Noop message filter.
+        /// </summary>
+        [Serializable]
+        private class MessageListener : IMessageListener<int>
+        {
+            /** <inheritdoc /> */
+            public bool Invoke(Guid nodeId, int message)
+            {
+                return true;
+            }
+        }
+    }
+}
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
index e36ef07..9fa0afb 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
@@ -20,11 +20,8 @@ namespace Apache.Ignite.Core.Tests
     using System;
     using System.IO;
     using System.Linq;
-    using System.Threading;
     using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Impl.Common;
-    using Apache.Ignite.Core.Messaging;
-    using Apache.Ignite.Core.Tests.Process;
     using NUnit.Framework;
 
     /// <summary>
@@ -39,7 +36,6 @@ namespace Apache.Ignite.Core.Tests
         [TearDown]
         public void TearDown()
         {
-            TestUtils.KillProcesses();
             Ignition.StopAll(true);
         }
 
@@ -66,7 +62,7 @@ namespace Apache.Ignite.Core.Tests
         {
             var cfg = new IgniteConfiguration
             {
-                SpringConfigUrl = "config\\spring-test.xml",
+                SpringConfigUrl = Path.Combine("Config", "spring-test.xml"),
                 JvmClasspath = TestUtils.CreateTestClasspath()
             };
 
@@ -275,72 +271,5 @@ namespace Apache.Ignite.Core.Tests
 
             Assert.AreEqual(1, cache.Get(1));
         }
-
-        /// <summary>
-        /// Tests the processor initialization and grid usage right after topology enter.
-        /// </summary>
-        [Test]
-        public void TestProcessorInit()
-        {
-            var cfg = new IgniteConfiguration
-            {
-                SpringConfigUrl = "Config\\spring-test.xml",
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath()
-            };
-
-            // Start local node
-            var grid = Ignition.Start(cfg);
-
-            // Start remote node in a separate process
-            // ReSharper disable once UnusedVariable
-            var proc = new IgniteProcess(
-                "-springConfigUrl=" + Path.GetFullPath(cfg.SpringConfigUrl),
-                "-J-Xms512m",
-                "-J-Xmx512m");
-
-            Assert.IsTrue(proc.Alive);
-
-            var cts = new CancellationTokenSource();
-            var token = cts.Token;
-
-            // Spam message subscriptions on a separate thread
-            // to test race conditions during processor init on remote node
-            var listenTask = TaskRunner.Run(() =>
-            {
-                var filter = new MessageListener();
-
-                while (!token.IsCancellationRequested)
-                {
-                    var listenId = grid.GetMessaging().RemoteListen(filter);
-
-                    grid.GetMessaging().StopRemoteListen(listenId);
-                }
-                // ReSharper disable once FunctionNeverReturns
-            });
-
-            // Wait for remote node to join
-            Assert.IsTrue(grid.WaitTopology(2));
-
-            // Wait some more for initialization
-            Thread.Sleep(1000);
-
-            // Cancel listen task and check that it finishes
-            cts.Cancel();
-            Assert.IsTrue(listenTask.Wait(5000));
-        }
-
-        /// <summary>
-        /// Noop message filter.
-        /// </summary>
-        [Serializable]
-        private class MessageListener : IMessageListener<int>
-        {
-            /** <inheritdoc /> */
-            public bool Invoke(Guid nodeId, int message)
-            {
-                return true;
-            }
-        }
     }
 }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/IgnitionStartTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgnitionStartTest.cs
similarity index 81%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/IgnitionStartTest.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgnitionStartTest.cs
index 94a536a..7bcf32c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/Common/IgnitionStartTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgnitionStartTest.cs
@@ -15,33 +15,42 @@
  * limitations under the License.
  */
 
-namespace Apache.Ignite.Core.Tests.DotNetCore.Common
+namespace Apache.Ignite.Core.Tests
 {
     using System;
     using System.IO;
     using System.Linq;
-    using Apache.Ignite.Core.Cache.Configuration;
     using Apache.Ignite.Core.Configuration;
     using Apache.Ignite.Core.Discovery.Tcp;
+    using Apache.Ignite.Core.Impl.Common;
     using NUnit.Framework;
 
     /// <summary>
-    /// Tests Ignite startup.
+    /// Tests Ignite startup with Code, XML, and Spring configurations.
     /// </summary>
-    public class IgnitionStartTest : TestBase
+    public class IgnitionStartTest
     {
         /// <summary>
-        /// Tests that Ignite starts with default configuration.
+        /// Tears down the test fixture.
+        /// </summary>
+        [TestFixtureTearDown]
+        public void FixtureTearDown()
+        {
+            Ignition.StopAll(true);
+        }
+
+        /// <summary>
+        /// Tests that Ignite starts with the default configuration.
         /// </summary>
         [Test]
         public void TestIgniteStartsWithDefaultConfig()
         {
-            var ignite = Start();
+            var ignite = Ignition.Start(TestUtils.GetTestConfiguration());
             Assert.IsNotNull(ignite);
             Assert.AreEqual(ignite, Ignition.GetIgnite());
 
             // Second node.
-            var ignite2 = Start("ignite-2");
+            var ignite2 = Ignition.Start(TestUtils.GetTestConfiguration(name: "ignite-2"));
             Assert.AreEqual(2, Ignition.GetAll().Count);
 
             // Stop node.
@@ -54,24 +63,20 @@ namespace Apache.Ignite.Core.Tests.DotNetCore.Common
         }
 
         /// <summary>
-        /// Tests the ignite starts from application configuration.
+        /// Tests that Ignite starts from the application configuration.
         /// </summary>
         [Test]
         public void TestIgniteStartsFromAppConfig()
         {
-            // 1) MsTest does not pick up the config file, so we have to provide it manually.
-            // 2) Note that System.Configuration.ConfigurationManager NuGet package has to be installed.
             var configPath = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "app.config");
 
-            // Force test classpath.
-            TestUtils.GetTestConfiguration();
+            Environment.SetEnvironmentVariable(Classpath.EnvIgniteNativeTestClasspath, "true");
 
             using (var ignite = Ignition.StartFromApplicationConfiguration("igniteConfiguration", configPath))
             {
                 var cache = ignite.GetCache<int, int>(ignite.GetCacheNames().Single());
 
-                Assert.AreEqual("cacheFromConfig", cache.Name);
-                Assert.AreEqual(CacheMode.Replicated, cache.GetConfiguration().CacheMode);
+                Assert.AreEqual("cacheName", cache.Name);
             }
         }
 
@@ -114,4 +119,4 @@ namespace Apache.Ignite.Core.Tests.DotNetCore.Common
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Impl/Compute/ComputeImplTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Impl/Compute/ComputeImplTest.cs
deleted file mode 100644
index c888dda..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Impl/Compute/ComputeImplTest.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests.Impl.Compute
-{
-    using Apache.Ignite.Core.Binary;
-    using Apache.Ignite.Core.Impl;
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Cluster;
-    using Apache.Ignite.Core.Impl.Compute;
-    using Moq;
-    using NUnit.Framework;
-
-    /// <summary>
-    /// Tests for the compute implementations
-    /// </summary>
-    [TestFixture]
-    internal class ComputeImplTest
-    {
-        private const int OpWithNoResultCacheType = 9;
-
-        /// <summary>
-        /// Test caching was disabled by passing right type
-        /// </summary>
-        [Test]
-        public void TestCachingWasDisabledByPassingRightType()
-        {
-            var target = GetTarget();
-            var clusterGroupImpl = new ClusterGroupImpl(target.Object, null);
-            var sut = new ComputeImpl(target.Object, clusterGroupImpl, true);
-
-            sut.WithNoResultCache();
-
-            target.Verify(x => x.InLongOutLong(OpWithNoResultCacheType, It.IsAny<long>()), Times.Once());
-        }
-
-        private static Mock<IPlatformTargetInternal> GetTarget()
-        {
-            var target = new Mock<IPlatformTargetInternal>();
-            target
-                .Setup(x => x.InLongOutLong(It.IsAny<int>(), It.IsAny<long>()))
-                .Returns(1L);
-
-            target
-                .SetupGet(x => x.Marshaller)
-                .Returns(new Marshaller(new BinaryConfiguration()));
-
-            return target;
-        }
-    }
-}
\ No newline at end of file
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml
index 95b5bf9..0fd7218 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml
@@ -35,7 +35,7 @@
         <dependency>
             <groupId>org.apache.ignite</groupId>
             <artifactId>ignite-core</artifactId>
-            <version>2.7.6</version>
+            <version>2.4.0</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
index 8f16876..1b782e7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
@@ -35,10 +35,10 @@ namespace Apache.Ignite.Core.Tests
     public class LifecycleTest
     {
         /** Configuration: without Java beans. */
-        private const string CfgNoBeans = "config//lifecycle//lifecycle-no-beans.xml";
+        private const string CfgNoBeans = "Config/Lifecycle/lifecycle-no-beans.xml";
 
         /** Configuration: with Java beans. */
-        private const string CfgBeans = "config//lifecycle//lifecycle-beans.xml";
+        private const string CfgBeans = "Config/Lifecycle//lifecycle-beans.xml";
 
         /** Whether to throw an error on lifecycle event. */
         internal static bool ThrowErr;
@@ -77,7 +77,7 @@ namespace Apache.Ignite.Core.Tests
         {
             Ignition.StopAll(true);
         }
-        
+
         /// <summary>
         /// Test without Java beans.
         /// </summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
index 3c498d7..134bd45 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP
 namespace Apache.Ignite.Core.Tests
 {
     using System;
@@ -31,7 +32,7 @@ namespace Apache.Ignite.Core.Tests
     public class LoadDllTest
     {
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [SetUp]
         public void SetUp()
@@ -40,7 +41,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [TearDown]
         public void TearDown()
@@ -49,7 +50,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [Test]
         public void TestLoadFromGac()
@@ -60,7 +61,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [Test]
         public void TestLoadFromCurrentDir()
@@ -72,13 +73,13 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [Test]
         public void TestLoadAllDllInDir()
         {
             var dirInfo = Directory.CreateDirectory(Path.GetTempPath() + "/testDlls");
-            
+
             Assert.False(IsLoaded("dllFromDir1"));
             Assert.False(IsLoaded("dllFromDir2"));
 
@@ -93,7 +94,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [Test]
         public void TestLoadFromCurrentDirByName()
@@ -105,7 +106,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [Test]
         public void TestLoadByAbsoluteUri()
@@ -118,7 +119,7 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         [Test]
         public void TestLoadUnexistingLibrary()
@@ -137,12 +138,12 @@ namespace Apache.Ignite.Core.Tests
             {
                 Assemblies = new[] {dll}
             });
-            
+
             Assert.IsNotNull(ignite);
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         /// <param name="outputPath"></param>
         private void GenerateDll(string outputPath)
@@ -178,3 +179,4 @@ namespace Apache.Ignite.Core.Tests
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/ConcurrentMemoryTarget.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/ConcurrentMemoryTarget.cs
index 66bdbe2..74f948d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/ConcurrentMemoryTarget.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/ConcurrentMemoryTarget.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if (!NETCOREAPP)
 namespace Apache.Ignite.Core.Tests.Log
 {
     using System.Collections.Generic;
@@ -70,4 +71,5 @@ namespace Apache.Ignite.Core.Tests.Log
             }
         }
     }
-}
\ No newline at end of file
+}
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/DefaultLoggerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/DefaultLoggerTest.cs
index 4eb5b9c..fd84cb7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/DefaultLoggerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/DefaultLoggerTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if !NETCOREAPP
 namespace Apache.Ignite.Core.Tests.Log
 {
     using System;
@@ -37,7 +38,7 @@ namespace Apache.Ignite.Core.Tests.Log
         public void TestJavaLogger()
         {
             // Run the test in a separate process because log4jlogger has some static state,
-            // and after Ignite has been started once, it is not possible to start a new node 
+            // and after Ignite has been started once, it is not possible to start a new node
             // with a different logger config.
             const string envVar = "DefaultLoggerTest.TestJavaLogger";
 
@@ -55,7 +56,8 @@ namespace Apache.Ignite.Core.Tests.Log
                     CacheConfiguration = new[]
                     {
                         new CacheConfiguration("cache1", new QueryEntity(typeof(uint), typeof(ulong)))
-                    }
+                    },
+                    Logger = null
                 };
 
                 // Start Ignite and verify file log
@@ -112,3 +114,4 @@ namespace Apache.Ignite.Core.Tests.Log
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/Log4NetLoggerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/Log4NetLoggerTest.cs
index 2b28439..cc9108a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/Log4NetLoggerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/Log4NetLoggerTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if (!NETCOREAPP)
 namespace Apache.Ignite.Core.Tests.Log
 {
     using System;
@@ -186,3 +187,4 @@ namespace Apache.Ignite.Core.Tests.Log
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/NLogLoggerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/NLogLoggerTest.cs
index 2743353..e305d18 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/NLogLoggerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/NLogLoggerTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if (!NETCOREAPP)
 namespace Apache.Ignite.Core.Tests.Log
 {
     using System;
@@ -86,7 +87,7 @@ namespace Apache.Ignite.Core.Tests.Log
             var nLogger = new IgniteNLogLogger();
 
             // All parameters.
-            nLogger.Log(LogLevel.Trace, "msg{0}", new object[] {1}, CultureInfo.InvariantCulture, "category", 
+            nLogger.Log(LogLevel.Trace, "msg{0}", new object[] {1}, CultureInfo.InvariantCulture, "category",
                 "java-err", new Exception("myException"));
 
             Assert.AreEqual("category|Trace|msg1|myException|nativeErrorInfo=java-err", GetLastLog());
@@ -163,3 +164,4 @@ namespace Apache.Ignite.Core.Tests.Log
 
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MarshallerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MarshallerTest.cs
index 2ec9c6f..2359813 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MarshallerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MarshallerTest.cs
@@ -32,7 +32,7 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestDefaultMarhsaller()
         {
-            using (var grid = StartIgnite("config\\marshaller-default.xml"))
+            using (var grid = StartIgnite("Config\\marshaller-default.xml"))
             {
                 var cache = grid.GetOrCreateCache<int, int>("default");
 
@@ -43,13 +43,13 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// Tests the binary marhsaller.
+        /// Tests the binary marshaller.
         /// Marshaller can be specified explicitly in config.
         /// </summary>
         [Test]
-        public void TestExplicitMarhsaller()
+        public void TestExplicitMarshaller()
         {
-            using (var grid = StartIgnite("config\\marshaller-explicit.xml"))
+            using (var grid = StartIgnite("Config\\marshaller-explicit.xml"))
             {
                 var cache = grid.GetOrCreateCache<int, int>("default");
 
@@ -65,7 +65,7 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestInvalidMarshaller()
         {
-            var ex = Assert.Throws<IgniteException>(() => StartIgnite("config\\marshaller-invalid.xml"));
+            var ex = Assert.Throws<IgniteException>(() => StartIgnite("Config\\marshaller-invalid.xml"));
             Assert.AreEqual("Unsupported marshaller (only org.apache.ignite.internal.binary.BinaryMarshaller " +
                             "can be used when running Apache Ignite.NET): org.apache.ignite.internal." +
                             "marshaller.optimized.OptimizedMarshaller", ex.Message, ex.ToString());
@@ -82,4 +82,4 @@ namespace Apache.Ignite.Core.Tests
             });
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MultiAppDomainTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MultiAppDomainTest.cs
index 0157255..ac91cec 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MultiAppDomainTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MultiAppDomainTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if (!NETCOREAPP)
 namespace Apache.Ignite.Core.Tests
 {
     using System;
@@ -54,7 +55,7 @@ namespace Apache.Ignite.Core.Tests
         public void TestIisBehavior()
         {
             var ignite = Ignition.Start(GetConfig());
-            
+
             var cache = ignite.CreateCache<int, int>(new CacheConfiguration
             {
                 Name =  CacheName,
@@ -162,10 +163,11 @@ namespace Apache.Ignite.Core.Tests
 
                 // No need to stop: this will happen on domain unload.
                 var ignite = Ignition.Start(cfg);
-                
+
                 var cache = ignite.GetCache<int, int>(CacheName);
                 Assert.AreEqual(1, cache[1]);
             }
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/IgniteProcessConsoleOutputReader.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/IgniteProcessConsoleOutputReader.cs
index 00cc040..be1aa1ef 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/IgniteProcessConsoleOutputReader.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/IgniteProcessConsoleOutputReader.cs
@@ -34,6 +34,11 @@ namespace Apache.Ignite.Core.Tests.Process
         /** <inheritDoc /> */
         public void OnOutput(Process proc, string data, bool err)
         {
+            if (string.IsNullOrWhiteSpace(data))
+            {
+                return;
+            }
+
             Console.WriteLine(err ? ErrFormat : OutFormat, proc.Id, data);
         }
     }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs
index e8aa60a..c06ac98 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ReconnectTest.cs
@@ -25,7 +25,6 @@ namespace Apache.Ignite.Core.Tests
     using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Lifecycle;
     using Apache.Ignite.Core.Tests.Client.Cache;
-    using Apache.Ignite.Core.Tests.Process;
     using NUnit.Framework;
 
     /// <summary>
@@ -104,6 +103,7 @@ namespace Apache.Ignite.Core.Tests
             Assert.AreEqual(2, cache.Get(1).Id);
         }
 
+#if !NETCOREAPP
         /// <summary>
         /// Tests the failed connection scenario, where servers are alive, but can't be contacted.
         /// </summary>
@@ -117,7 +117,9 @@ namespace Apache.Ignite.Core.Tests
                 JvmOptions = TestUtils.TestJavaOptions()
             };
 
-            var proc = StartServerProcess(cfg);
+            var proc = new Process.IgniteProcess(
+                "-springConfigUrl=" + cfg.SpringConfigUrl, "-J-ea", "-J-Xcheck:jni", "-J-Xms512m", "-J-Xmx512m",
+                "-J-DIGNITE_QUIET=false");
 
             Ignition.ClientMode = true;
 
@@ -165,6 +167,7 @@ namespace Apache.Ignite.Core.Tests
                 Assert.AreEqual(1, reconnected);
             }
         }
+#endif
 
         /// <summary>
         /// Tests writer structure cleanup after client reconnect with full cluster restart.
@@ -215,39 +218,23 @@ namespace Apache.Ignite.Core.Tests
 
             // Verify that we can deserialize on server (meta is resent properly).
             cache[2] = new Person(2);
-            
+
             var serverCache = server2.GetCache<int, Person>(CacheName);
             Assert.AreEqual(2, serverCache[2].Id);
         }
 
         /// <summary>
-        /// Starts the server process.
-        /// </summary>
-        private static IgniteProcess StartServerProcess(IgniteConfiguration cfg)
-        {
-            return new IgniteProcess(
-                "-springConfigUrl=" + cfg.SpringConfigUrl, "-J-ea", "-J-Xcheck:jni", "-J-Xms512m", "-J-Xmx512m",
-                "-J-DIGNITE_QUIET=false");
-        }
-
-        /// <summary>
-        /// Test set up.
-        /// </summary>
-        [SetUp]
-        public void SetUp()
-        {
-            Ignition.StopAll(true);
-            IgniteProcess.KillAll();
-        }
-
-        /// <summary>
         /// Test tear down.
         /// </summary>
         [TearDown]
         public void TearDown()
         {
             Ignition.StopAll(true);
-            IgniteProcess.KillAll();
+
+#if !NETCOREAPP
+            Process.IgniteProcess.KillAll();
+#endif
+
             Ignition.ClientMode = false;
         }
     }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/CallPlatformServiceTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/CallPlatformServiceTest.cs
index 3efe0e8..8bd55a1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/CallPlatformServiceTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/CallPlatformServiceTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+// ReSharper disable NonReadonlyMemberInGetHashCode
 namespace Apache.Ignite.Core.Tests.Services
 {
     using System;
@@ -38,7 +39,7 @@ namespace Apache.Ignite.Core.Tests.Services
 
         /** */
         private const string CheckCollectionsTaskName = "org.apache.ignite.platform.PlatformServiceCallCollectionsTask";
-        
+
         /** */
         private const string CheckThinTaskName = "org.apache.ignite.platform.PlatformServiceCallThinTask";
 
@@ -54,7 +55,7 @@ namespace Apache.Ignite.Core.Tests.Services
 
         /** */
         protected IIgnite Grid3;
-        
+
         /// <summary>
         /// Start grids and deploy test service.
         /// </summary>
@@ -63,7 +64,7 @@ namespace Apache.Ignite.Core.Tests.Services
         {
             StartGrids();
         }
-        
+
         /// <summary>
         /// Stop grids after test.
         /// </summary>
@@ -91,7 +92,7 @@ namespace Apache.Ignite.Core.Tests.Services
                 TotalCount = 1,
                 Service = new TestPlatformService()
             };
-            
+
             Grid1.GetServices().Deploy(cfg);
 
             Grid1.GetCompute().ExecuteJavaTask<object>(taskName, new object[] { ServiceName, local });
@@ -119,7 +120,7 @@ namespace Apache.Ignite.Core.Tests.Services
 
             Ignition.StopAll(true);
         }
-        
+
         /// <summary>
         /// Gets the Ignite configuration.
         /// </summary>
@@ -128,23 +129,23 @@ namespace Apache.Ignite.Core.Tests.Services
             return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 IgniteInstanceName = "grid" + idx,
-                BinaryConfiguration = new BinaryConfiguration(typeof(TestKey), typeof(TestValue), 
+                BinaryConfiguration = new BinaryConfiguration(typeof(TestKey), typeof(TestValue),
                     typeof(BinarizableTestValue))
                 {
                     NameMapper = BinaryBasicNameMapper.SimpleNameInstance
                 }
             };
         }
-        
+
         /** */
         public interface ITestPlatformService : IService
         {
             /** */
             Guid NodeId { get; }
-            
+
             /** */
             Guid? GuidProp { get; set; }
-            
+
             /** */
             TestValue ValueProp { get; set; }
 
@@ -165,7 +166,7 @@ namespace Apache.Ignite.Core.Tests.Services
         }
 
         #pragma warning disable 649
-        
+
         /** */
         private class TestPlatformService : ITestPlatformService
         {
@@ -181,7 +182,7 @@ namespace Apache.Ignite.Core.Tests.Services
 
             /** <inheritdoc /> */
             public Guid? GuidProp { get; set; }
-            
+
             /** <inheritdoc /> */
             public TestValue ValueProp { get; set; }
 
@@ -190,7 +191,7 @@ namespace Apache.Ignite.Core.Tests.Services
             {
                 throw new Exception("Failed method");
             }
-            
+
             /** <inheritdoc /> */
             public TestValue[] AddOneToEach(TestValue[] arr)
             {
@@ -209,7 +210,7 @@ namespace Apache.Ignite.Core.Tests.Services
                 {
                     Id = val.Id + 1,
                     Name = val.Name
-                
+
                 }).ToList();
 
                 return new ArrayList(res);
@@ -223,16 +224,16 @@ namespace Apache.Ignite.Core.Tests.Services
                 foreach (DictionaryEntry pair in dict)
                 {
                     var k = new TestKey(((TestKey) pair.Key).Id + 1);
-                    
+
                     var v = new TestValue()
                     {
                         Id = ((TestValue)pair.Value).Id + 1,
                         Name = ((TestValue)pair.Value).Name
                     };
-                    
+
                     res.Add(k, v);
                 }
-                
+
                 return res;
             }
 
@@ -264,7 +265,7 @@ namespace Apache.Ignite.Core.Tests.Services
                 // No-op;
             }
         }
-        
+
         #pragma warning restore 649
 
         /** */
@@ -278,25 +279,25 @@ namespace Apache.Ignite.Core.Tests.Services
 
             /** */
             public int Id { get; set; }
-            
+
             /** <inheritdoc /> */
             public override int GetHashCode()
             {
                 return Id;
             }
-            
+
             /** <inheritdoc /> */
             public override bool Equals(object obj)
             {
-                if (ReferenceEquals(null, obj)) 
+                if (ReferenceEquals(null, obj))
                     return false;
-                
-                if (ReferenceEquals(this, obj)) 
+
+                if (ReferenceEquals(this, obj))
                     return true;
-                
-                if (obj.GetType() != GetType()) 
+
+                if (obj.GetType() != GetType())
                     return false;
-                
+
                 return Id == ((TestKey)obj).Id;
             }
         }
@@ -306,7 +307,7 @@ namespace Apache.Ignite.Core.Tests.Services
         {
             /** */
             public int Id { get; set; }
-            
+
             /** */
             public string Name { get; set; }
         }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
index b055617..1982e20 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
@@ -1076,9 +1076,10 @@ namespace Apache.Ignite.Core.Tests.Services
             if (Grid1 != null)
                 return;
 
-            Grid1 = Ignition.Start(GetConfiguration("Config\\Compute\\compute-grid1.xml"));
-            Grid2 = Ignition.Start(GetConfiguration("Config\\Compute\\compute-grid2.xml"));
-            Grid3 = Ignition.Start(GetConfiguration("Config\\Compute\\compute-grid3.xml"));
+            var path = Path.Combine("Config", "Compute", "compute-grid");
+            Grid1 = Ignition.Start(GetConfiguration(path + "1.xml"));
+            Grid2 = Ignition.Start(GetConfiguration(path + "2.xml"));
+            Grid3 = Ignition.Start(GetConfiguration(path + "3.xml"));
 
             Grids = new[] { Grid1, Grid2, Grid3 };
         }
@@ -1123,12 +1124,10 @@ namespace Apache.Ignite.Core.Tests.Services
         /// </summary>
         private IgniteConfiguration GetConfiguration(string springConfigUrl)
         {
-#if !NETCOREAPP
             if (!CompactFooter)
             {
                 springConfigUrl = Compute.ComputeApiTestFullFooter.ReplaceFooterSetting(springConfigUrl);
             }
-#endif
 
             return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestBase.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestBase.cs
index d15a2c4..a7cc695 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestBase.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestBase.cs
@@ -22,6 +22,7 @@ namespace Apache.Ignite.Core.Tests
     /// <summary>
     /// Code configuration test base.
     /// </summary>
+    [TestFixture]
     public abstract class TestBase
     {
         /** */
@@ -87,4 +88,4 @@ namespace Apache.Ignite.Core.Tests
             get { return Ignition.GetIgnite("1"); }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
index fef321f..2e13e46 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
@@ -15,6 +15,7 @@
 * limitations under the License.
 */
 
+#if (!NETCOREAPP)
 namespace Apache.Ignite.Core.Tests
 {
     using System;
@@ -43,7 +44,7 @@ namespace Apache.Ignite.Core.Tests
             if (args.Length == 1 && args[0] == "-basicTests")
             {
                 RunBasicTests();
-                
+
                 return;
             }
 
@@ -112,7 +113,7 @@ namespace Apache.Ignite.Core.Tests
                 "-run:" + string.Join(",", testClass.Select(x => x.FullName)),
                 Assembly.GetAssembly(typeof(TestRunner)).Location
             };
-            
+
             return Runner.Main(args.ToArray());
         }
 
@@ -131,4 +132,22 @@ namespace Apache.Ignite.Core.Tests
             return Runner.Main(args);
         }
     }
-}
\ No newline at end of file
+}
+#else
+namespace Apache.Ignite.Core.Tests
+{
+    /// <summary>
+    /// Test runner.
+    /// </summary>
+    internal static class TestRunner
+    {
+        /// <summary>
+        /// Console entry point.
+        /// </summary>
+        private static void Main()
+        {
+            new IgniteStartStopTest().TestStartDefault();
+        }
+    }
+}
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.Windows.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.Windows.cs
deleted file mode 100644
index 281b329..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.Windows.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.
- */
-
-namespace Apache.Ignite.Core.Tests
-{
-    using System;
-    using System.Diagnostics;
-    using System.Diagnostics.CodeAnalysis;
-    using Apache.Ignite.Core.Configuration;
-    using Apache.Ignite.Core.Failure;
-    using Apache.Ignite.Core.Impl.Common;
-    using Apache.Ignite.Core.Tests.Process;
-    using NUnit.Framework;
-
-    /// <summary>
-    /// Test utility methods - Windows-specific part (full framework).
-    /// </summary>
-    public static partial class TestUtils
-    {
-        /// <summary>
-        ///
-        /// </summary>
-        /// <returns></returns>
-        public static string CreateTestClasspath()
-        {
-            var home = IgniteHome.Resolve();
-            return Classpath.CreateClasspath(null, home, forceTestClasspath: true);
-        }
-
-        /// <summary>
-        /// Kill Ignite processes.
-        /// </summary>
-        public static void KillProcesses()
-        {
-            IgniteProcess.KillAll();
-        }
-
-        /// <summary>
-        /// Gets the default code-based test configuration.
-        /// </summary>
-        public static IgniteConfiguration GetTestConfiguration(bool? jvmDebug = null, string name = null)
-        {
-            return new IgniteConfiguration
-            {
-                DiscoverySpi = GetStaticDiscovery(),
-                Localhost = "127.0.0.1",
-                JvmOptions = TestJavaOptions(jvmDebug),
-                JvmClasspath = CreateTestClasspath(),
-                IgniteInstanceName = name,
-                DataStorageConfiguration = new DataStorageConfiguration
-                {
-                    DefaultDataRegionConfiguration = new DataRegionConfiguration
-                    {
-                        Name = DataStorageConfiguration.DefaultDataRegionName,
-                        InitialSize = 128 * 1024 * 1024,
-                        MaxSize = Environment.Is64BitProcess
-                            ? DataRegionConfiguration.DefaultMaxSize
-                            : 256 * 1024 * 1024
-                    }
-                },
-                FailureHandler = new NoOpFailureHandler(),
-                WorkDirectory = WorkDir
-            };
-        }
-
-        /// <summary>
-        /// Runs the test in new process.
-        /// </summary>
-        [SuppressMessage("ReSharper", "AssignNullToNotNullAttribute")]
-        public static void RunTestInNewProcess(string fixtureName, string testName)
-        {
-            var procStart = new ProcessStartInfo
-            {
-                FileName = typeof(TestUtils).Assembly.Location,
-                Arguments = fixtureName + " " + testName,
-                CreateNoWindow = true,
-                UseShellExecute = false,
-                RedirectStandardOutput = true,
-                RedirectStandardError = true
-            };
-
-            var proc = System.Diagnostics.Process.Start(procStart);
-            Assert.IsNotNull(proc);
-
-            try
-            {
-                proc.AttachProcessConsoleReader();
-
-                Assert.IsTrue(proc.WaitForExit(30000));
-                Assert.AreEqual(0, proc.ExitCode);
-            }
-            finally
-            {
-                if (!proc.HasExited)
-                {
-                    proc.Kill();
-                }
-            }
-        }
-    }
-}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.Common.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
similarity index 82%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.Common.cs
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
index e244000..cb5fe50 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.Common.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
@@ -22,6 +22,8 @@ namespace Apache.Ignite.Core.Tests
     using System.Collections.Concurrent;
     using System.Collections.Generic;
     using System.Diagnostics;
+    using System.Diagnostics.CodeAnalysis;
+    using System.Globalization;
     using System.IO;
     using System.Linq;
     using System.Reflection;
@@ -30,17 +32,22 @@ namespace Apache.Ignite.Core.Tests
     using Apache.Ignite.Core.Cache.Affinity;
     using Apache.Ignite.Core.Client;
     using Apache.Ignite.Core.Cluster;
+    using Apache.Ignite.Core.Configuration;
     using Apache.Ignite.Core.Discovery.Tcp;
     using Apache.Ignite.Core.Discovery.Tcp.Static;
+    using Apache.Ignite.Core.Failure;
     using Apache.Ignite.Core.Impl;
     using Apache.Ignite.Core.Impl.Binary;
     using Apache.Ignite.Core.Impl.Client;
+    using Apache.Ignite.Core.Impl.Common;
+    using Apache.Ignite.Core.Log;
+    using Apache.Ignite.Core.Tests.Process;
     using NUnit.Framework;
 
     /// <summary>
     /// Test utility methods.
     /// </summary>
-    public static partial class TestUtils
+    public static class TestUtils
     {
         /** Indicates long running and/or memory/cpu intensive test. */
         public const string CategoryIntensive = "LONG_TEST";
@@ -560,5 +567,119 @@ namespace Apache.Ignite.Core.Tests
             var socket = GetPrivateField<ClientSocket>(failoverSocket, "_socket");
             return GetPrivateField<ICollection>(socket, "_notificationListeners");
         }
+
+                /// <summary>
+        ///
+        /// </summary>
+        /// <returns></returns>
+        public static string CreateTestClasspath()
+        {
+            var home = IgniteHome.Resolve();
+            return Classpath.CreateClasspath(null, home, forceTestClasspath: true);
+        }
+
+        /// <summary>
+        /// Kill Ignite processes.
+        /// </summary>
+        public static void KillProcesses()
+        {
+            IgniteProcess.KillAll();
+        }
+
+        /// <summary>
+        /// Gets the default code-based test configuration.
+        /// </summary>
+        public static IgniteConfiguration GetTestConfiguration(bool? jvmDebug = null, string name = null)
+        {
+            return new IgniteConfiguration
+            {
+                DiscoverySpi = GetStaticDiscovery(),
+                Localhost = "127.0.0.1",
+                JvmOptions = TestJavaOptions(jvmDebug),
+                JvmClasspath = CreateTestClasspath(),
+                IgniteInstanceName = name,
+                DataStorageConfiguration = new DataStorageConfiguration
+                {
+                    DefaultDataRegionConfiguration = new DataRegionConfiguration
+                    {
+                        Name = DataStorageConfiguration.DefaultDataRegionName,
+                        InitialSize = 128 * 1024 * 1024,
+                        MaxSize = Environment.Is64BitProcess
+                            ? DataRegionConfiguration.DefaultMaxSize
+                            : 256 * 1024 * 1024
+                    }
+                },
+                FailureHandler = new NoOpFailureHandler(),
+                WorkDirectory = WorkDir,
+                Logger = new TestContextLogger()
+            };
+        }
+
+        /// <summary>
+        /// Runs the test in new process.
+        /// </summary>
+        [SuppressMessage("ReSharper", "AssignNullToNotNullAttribute")]
+        public static void RunTestInNewProcess(string fixtureName, string testName)
+        {
+            var procStart = new ProcessStartInfo
+            {
+                FileName = typeof(TestUtils).Assembly.Location,
+                Arguments = fixtureName + " " + testName,
+                CreateNoWindow = true,
+                UseShellExecute = false,
+                RedirectStandardOutput = true,
+                RedirectStandardError = true
+            };
+
+            var proc = System.Diagnostics.Process.Start(procStart);
+            Assert.IsNotNull(proc);
+
+            try
+            {
+                proc.AttachProcessConsoleReader();
+
+                Assert.IsTrue(proc.WaitForExit(50000));
+                Assert.AreEqual(0, proc.ExitCode);
+            }
+            finally
+            {
+                if (!proc.HasExited)
+                {
+                    proc.Kill();
+                }
+            }
+        }
+
+        /// <summary>
+        /// Logs to test progress. Produces immediate console output on .NET Core.
+        /// </summary>
+        public class TestContextLogger : ILogger
+        {
+            /** <inheritdoc /> */
+            public void Log(LogLevel level, string message, object[] args, IFormatProvider formatProvider,
+                string category, string nativeErrorInfo, Exception ex)
+            {
+                if (!IsEnabled(level))
+                {
+                    return;
+                }
+
+                var text = args != null
+                    ? string.Format(formatProvider ?? CultureInfo.InvariantCulture, message, args)
+                    : message;
+
+#if NETCOREAPP
+                TestContext.Progress.WriteLine(text);
+#else
+                Console.WriteLine(text);
+#endif
+            }
+
+            /** <inheritdoc /> */
+            public bool IsEnabled(LogLevel level)
+            {
+                return level >= LogLevel.Info;
+            }
+        }
     }
 }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/WindowsServiceTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/WindowsServiceTest.cs
index ee909f3..3049f9a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/WindowsServiceTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/WindowsServiceTest.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if (!NETCOREAPP)
 namespace Apache.Ignite.Core.Tests
 {
     using System;
@@ -170,3 +171,4 @@ namespace Apache.Ignite.Core.Tests
         }
     }
 }
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/tde.jks b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/tde.jks
similarity index 100%
rename from modules/platforms/dotnet/Apache.Ignite.Core.Tests.DotNetCore/tde.jks
rename to modules/platforms/dotnet/Apache.Ignite.Core.Tests/tde.jks
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.DotNetCore.csproj b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.DotNetCore.csproj
index 56afc81..c2dadbc 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.DotNetCore.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.DotNetCore.csproj
@@ -12,4 +12,12 @@
   <ItemGroup>
     <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.4.0" />
   </ItemGroup>
+  <ItemGroup>
+    <None Update="IgniteConfigurationSection.xsd">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Update="IgniteClientConfigurationSection.xsd">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
index c45a7f8..beb315d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
@@ -131,6 +131,7 @@
     <Compile Include="Impl\IgniteLock.cs" />
     <Compile Include="Impl\Log\NoopLogger.cs" />
     <Compile Include="Impl\Transactions\TransactionCollectionImpl.cs" />
+    <Compile Include="Impl\Unmanaged\Jni\Jvm.CrossAppDomain.cs" />
     <Compile Include="Impl\Unmanaged\UnmanagedThread.cs" />
     <Compile Include="Log\ConsoleLogger.cs" />
     <Compile Include="Log\IDateTimeProvider.cs" />
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
index 9f2ea63..437b373 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
@@ -100,9 +100,9 @@ namespace Apache.Ignite.Core.Impl.Binary
         {
             IgniteArgumentCheck.NotNullOrEmpty(fieldName, "fieldName");
 
-            int pos;
+            int unused;
 
-            return TryGetFieldPosition(fieldName, out pos);
+            return TryGetFieldPosition(fieldName, out unused);
         }
 
         /// <summary>
@@ -232,7 +232,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// </summary>
         private void InitializeFields(IBinaryTypeDescriptor desc = null)
         {
-            if (_fields != null) 
+            if (_fields != null)
                 return;
 
             desc = desc ?? _marsh.GetDescriptor(true, _header.TypeId);
@@ -275,7 +275,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /** <inheritdoc /> */
         public override string ToString()
         {
-            return ToString(new Dictionary<int, int>());            
+            return ToString(new Dictionary<int, int>());
         }
 
         /// <summary>
@@ -318,7 +318,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                     handled[_offset] = idHash;
 
                     InitializeFields();
-                    
+
                     foreach (string fieldName in meta.Fields)
                     {
                         sb.Append(", ");
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
index 04cc210..9b47bb8 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
@@ -70,7 +70,7 @@ namespace Apache.Ignite.Core.Impl.Events
         /// </summary>
         /// <param name="target">Target.</param>
         /// <param name="clusterGroup">Cluster group.</param>
-        public Events(IPlatformTargetInternal target, IClusterGroup clusterGroup) 
+        public Events(IPlatformTargetInternal target, IClusterGroup clusterGroup)
             : base(target)
         {
             Debug.Assert(clusterGroup != null);
@@ -102,7 +102,7 @@ namespace Apache.Ignite.Core.Impl.Events
         }
 
         /** <inheritDoc /> */
-        public Task<ICollection<T>> RemoteQueryAsync<T>(IEventFilter<T> filter, TimeSpan? timeout = null, 
+        public Task<ICollection<T>> RemoteQueryAsync<T>(IEventFilter<T> filter, TimeSpan? timeout = null,
             params int[] types) where T : IEvent
         {
             IgniteArgumentCheck.NotNull(filter, "filter");
@@ -113,14 +113,14 @@ namespace Apache.Ignite.Core.Impl.Events
         }
 
         /** <inheritDoc /> */
-        public ICollection<T> RemoteQuery<T>(IEventFilter<T> filter, TimeSpan? timeout = null, 
+        public ICollection<T> RemoteQuery<T>(IEventFilter<T> filter, TimeSpan? timeout = null,
             IEnumerable<int> types = null) where T : IEvent
         {
             return RemoteQuery(filter, timeout, TypesToArray(types));
         }
 
         /** <inheritDoc /> */
-        public Task<ICollection<T>> RemoteQueryAsync<T>(IEventFilter<T> filter, TimeSpan? timeout = null, 
+        public Task<ICollection<T>> RemoteQueryAsync<T>(IEventFilter<T> filter, TimeSpan? timeout = null,
             IEnumerable<int> types = null) where T : IEvent
         {
             return RemoteQueryAsync(filter, timeout, TypesToArray(types));
@@ -308,9 +308,9 @@ namespace Apache.Ignite.Core.Impl.Events
         {
             lock (_localFilters)
             {
-                Dictionary<int, LocalHandledEventFilter> filters;
+                Dictionary<int, LocalHandledEventFilter> unused;
 
-                if (_localFilters.TryGetValue(listener, out filters))
+                if (_localFilters.TryGetValue(listener, out unused))
                 {
                     var success = false;
 
@@ -390,8 +390,8 @@ namespace Apache.Ignite.Core.Impl.Events
         /// </summary>
         private long? GetFilterHandle<T>(IEventFilter<T> filter) where T : IEvent
         {
-            return filter != null 
-                ? Ignite.HandleRegistry.Allocate(new LocalEventFilter<T>(Marshaller, filter)) 
+            return filter != null
+                ? Ignite.HandleRegistry.Allocate(new LocalEventFilter<T>(Marshaller, filter))
                 : (long?) null;
         }
 
@@ -575,7 +575,7 @@ namespace Apache.Ignite.Core.Impl.Events
         /// <param name="timeout">The timeout.</param>
         /// <param name="types">The types.</param>
         /// <param name="writer">The writer.</param>
-        private static void WriteRemoteQuery<T>(IEventFilter<T> filter, TimeSpan? timeout, int[] types, 
+        private static void WriteRemoteQuery<T>(IEventFilter<T> filter, TimeSpan? timeout, int[] types,
             IBinaryRawWriter writer)
             where T : IEvent
         {
@@ -635,11 +635,11 @@ namespace Apache.Ignite.Core.Impl.Events
             /// <param name="invokeFunc">The invoke function.</param>
             /// <param name="releaseAction">The release action.</param>
             public LocalHandledEventFilter(
-                Func<IBinaryStream, bool> invokeFunc, Action<Func<IBinaryStream, bool>> releaseAction) 
+                Func<IBinaryStream, bool> invokeFunc, Action<Func<IBinaryStream, bool>> releaseAction)
                 : base(invokeFunc, releaseAction)
             {
                 // No-op.
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/AppDomains.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/AppDomains.cs
index e307ed0..cad4dc9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/AppDomains.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/AppDomains.cs
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0
+#if !NETCOREAPP
 namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
 {
     using System;
@@ -62,9 +62,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
             {
                 var prop = typeof(AppDomain).GetProperty(
                     "DefaultDomain", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
-                
+
                 Debug.Assert(prop != null);
-                
+
                 return (_AppDomain) prop.GetValue(null, null);
             }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs
index 411b9c5..bf5bd0b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs
@@ -109,8 +109,8 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
         /// </summary>
         public void ReleaseConsoleWriter(long id)
         {
-            ConsoleWriter writer;
-            var res = _consoleWriters.TryRemove(id, out writer);
+            ConsoleWriter unused;
+            var res = _consoleWriters.TryRemove(id, out unused);
             Debug.Assert(res);
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs
index 61256db..4bada09 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs
@@ -70,6 +70,7 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
 
         /** */
         // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
+        // ReSharper disable once NotAccessedField.Local
         private readonly EnvDelegates.GetStringChars _getStringChars;
 
         /** */
@@ -83,6 +84,7 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
 
         /** */
         // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
+        // ReSharper disable once NotAccessedField.Local
         private readonly EnvDelegates.ReleaseStringChars _releaseStringChars;
 
         /** */
@@ -414,7 +416,7 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
             {
                 return IgniteUtils.Utf8UnmanagedToString((sbyte*) chars, len);
             }
-            finally 
+            finally
             {
                 ReleaseStringUtfChars(jstring, chars);
             }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.CrossAppDomain.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.CrossAppDomain.cs
new file mode 100644
index 0000000..c02d6a2
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.CrossAppDomain.cs
@@ -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.
+ */
+
+#if !NETCOREAPP
+namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
+{
+    using System;
+    using System.Diagnostics.CodeAnalysis;
+    using System.Reflection;
+
+    /// <summary>
+    /// Cross-AppDomain Jvm parts, valid only on .NET Classic.
+    /// </summary>
+    internal sealed partial class Jvm
+    {
+        /// <summary>
+        /// Gets the callbacks.
+        /// </summary>
+        private static Callbacks GetCallbacksFromDefaultDomainImpl()
+        {
+            // JVM exists once per process, and JVM callbacks exist once per process.
+            // We should register callbacks ONLY from the default AppDomain (which can't be unloaded).
+            // Non-default appDomains should delegate this logic to the default one.
+            var defDomain = AppDomains.GetDefaultAppDomain();
+
+            // In some cases default AppDomain is not able to locate Apache.Ignite.Core assembly.
+            // First, use CreateInstanceFrom to set up the AssemblyResolve handler.
+            var resHelpType = typeof(AssemblyResolver);
+            var resHelp = (AssemblyResolver)defDomain.CreateInstanceFrom(resHelpType.Assembly.Location, resHelpType.FullName)
+                .Unwrap();
+            resHelp.TrackResolve(resHelpType.Assembly.FullName, resHelpType.Assembly.Location);
+
+            // Now use CreateInstance to get the domain helper of a properly loaded class.
+            var type = typeof(CallbackAccessor);
+            var helper = (CallbackAccessor)defDomain.CreateInstance(type.Assembly.FullName, type.FullName).Unwrap();
+
+            return helper.GetCallbacks();
+        }
+
+        /// <summary>
+        /// Provides access to <see cref="Callbacks"/> instance in the default AppDomain.
+        /// </summary>
+        private class CallbackAccessor : MarshalByRefObject
+        {
+            /// <summary>
+            /// Gets the callbacks.
+            /// </summary>
+            [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic",
+                Justification = "Only instance methods can be called across AppDomain boundaries.")]
+            public Callbacks GetCallbacks()
+            {
+                return GetOrCreate(null)._callbacks;
+            }
+        }
+
+        /// <summary>
+        /// Resolves Apache.Ignite.Core assembly in the default AppDomain when needed.
+        /// </summary>
+        private class AssemblyResolver : MarshalByRefObject
+        {
+            /// <summary>
+            /// Tracks the AssemblyResolve event.
+            /// </summary>
+            [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic",
+                Justification = "Only instance methods can be called across AppDomain boundaries.")]
+            public void TrackResolve(string name, string path)
+            {
+                AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
+                {
+                    if (args.Name == name)
+                    {
+                        return Assembly.LoadFrom(path);
+                    }
+
+                    return null;
+                };
+            }
+        }
+    }
+}
+#endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs
index 1b8ea0c..ff8ed56 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Jvm.cs
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
+// ReSharper disable PartialTypeWithSinglePart
 namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
 {
     using System;
     using System.Collections.Generic;
     using System.Diagnostics;
-    using System.Diagnostics.CodeAnalysis;
     using System.Linq;
-    using System.Reflection;
     using System.Runtime.InteropServices;
     using System.Security;
     using System.Threading;
@@ -32,7 +31,7 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
     /// JVM holder. Should exist once per domain.
     /// </summary>
     [SuppressUnmanagedCodeSecurity]
-    internal sealed unsafe class Jvm
+    internal sealed unsafe partial class Jvm
     {
         /** */
         // ReSharper disable once InconsistentNaming
@@ -116,24 +115,8 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
         /// </summary>
         private static Callbacks GetCallbacksFromDefaultDomain()
         {
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0
-            // JVM exists once per process, and JVM callbacks exist once per process.
-            // We should register callbacks ONLY from the default AppDomain (which can't be unloaded).
-            // Non-default appDomains should delegate this logic to the default one.
-            var defDomain = AppDomains.GetDefaultAppDomain();
-
-            // In some cases default AppDomain is not able to locate Apache.Ignite.Core assembly.
-            // First, use CreateInstanceFrom to set up the AssemblyResolve handler.
-            var resHelpType = typeof(AssemblyResolver);
-            var resHelp = (AssemblyResolver)defDomain.CreateInstanceFrom(resHelpType.Assembly.Location, resHelpType.FullName)
-                .Unwrap();
-            resHelp.TrackResolve(resHelpType.Assembly.FullName, resHelpType.Assembly.Location);
-
-            // Now use CreateInstance to get the domain helper of a properly loaded class.
-            var type = typeof(CallbackAccessor);
-            var helper = (CallbackAccessor)defDomain.CreateInstance(type.Assembly.FullName, type.FullName).Unwrap();
-
-            return helper.GetCallbacks();
+#if !NETCOREAPP
+            return GetCallbacksFromDefaultDomainImpl();
 #else
             throw new IgniteException("Multiple domains are not supported on .NET Core.");
 #endif
@@ -305,8 +288,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
                 fixed (JvmOption* optPtr = &opts[0])
                 {
                     args.options = optPtr;
-                    IntPtr env;
-                    res = JvmDll.Instance.CreateJvm(out jvm, out env, &args);
+
+                    IntPtr unused;
+                    res = JvmDll.Instance.CreateJvm(out jvm, out unused, &args);
                 }
 
                 if (res != JniResult.Success)
@@ -347,46 +331,5 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
         {
             del = (T) (object) Marshal.GetDelegateForFunctionPointer(ptr, typeof(T));
         }
-
-
-        /// <summary>
-        /// Provides access to <see cref="Callbacks"/> instance in the default AppDomain.
-        /// </summary>
-        private class CallbackAccessor : MarshalByRefObject
-        {
-            /// <summary>
-            /// Gets the callbacks.
-            /// </summary>
-            [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic",
-                Justification = "Only instance methods can be called across AppDomain boundaries.")]
-            public Callbacks GetCallbacks()
-            {
-                return GetOrCreate(null)._callbacks;
-            }
-        }
-
-        /// <summary>
-        /// Resolves Apache.Ignite.Core assembly in the default AppDomain when needed.
-        /// </summary>
-        private class AssemblyResolver : MarshalByRefObject
-        {
-            /// <summary>
-            /// Tracks the AssemblyResolve event.
-            /// </summary>
-            [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic",
-                Justification = "Only instance methods can be called across AppDomain boundaries.")]
-            public void TrackResolve(string name, string path)
-            {
-                AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
-                {
-                    if (args.Name == name)
-                    {
-                        return Assembly.LoadFrom(path);
-                    }
-
-                    return null;
-                };
-            }
-        }
     }
 }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/JvmDll.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/JvmDll.cs
index b8c3f48..d7fc791 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/JvmDll.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/JvmDll.cs
@@ -26,7 +26,6 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
     using System.Runtime.InteropServices;
     using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Log;
-    using Microsoft.Win32;
 
     /// <summary>
     /// Jvm.dll loader (libjvm.so on Linux, libjvm.dylib on macOs).
@@ -67,13 +66,6 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
                 "jre/lib/amd64/client"
             };
 
-        /** Registry lookup paths. */
-        private static readonly string[] JreRegistryKeys =
-        {
-            @"Software\JavaSoft\Java Runtime Environment",
-            @"Software\Wow6432Node\JavaSoft\Java Runtime Environment"
-        };
-
         /** Jvm dll file name. */
         internal static readonly string FileJvmDll = Os.IsWindows
             ? "jvm.dll"
@@ -305,15 +297,21 @@ namespace Apache.Ignite.Core.Impl.Unmanaged.Jni
         /// </summary>
         private static IEnumerable<KeyValuePair<string, string>> GetJvmDllPathsWindows()
         {
-#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP3_0
+#if !NETCOREAPP
             if (!Os.IsWindows)
             {
                 yield break;
             }
 
-            foreach (var regPath in JreRegistryKeys)
+            var jreRegistryKeys = new[]
+            {
+                @"Software\JavaSoft\Java Runtime Environment",
+                @"Software\Wow6432Node\JavaSoft\Java Runtime Environment"
+            };
+
+            foreach (var regPath in jreRegistryKeys)
             {
-                using (var jSubKey = Registry.LocalMachine.OpenSubKey(regPath))
+                using (var jSubKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath))
                 {
                     if (jSubKey == null)
                         continue;
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
index 87d6a78..4a7ec9a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
@@ -46,7 +46,7 @@ using System.Runtime.InteropServices;
 [assembly: InternalsVisibleTo("Apache.Ignite.Benchmarks, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a3e0c1df4cbedbd4ed0e88808401c69b69ec12575ed1c056ac9f448e018fb29af19d236b7b03563aad66c48ab2045e72971ed098d4f65d4cdd38d65abcb39b4f84c626b22ccab2754375f0e8c97dc304fa146f0eddad5cc40a71803a8f15b0b0bb0bff0d4bf0ff6a64bb1044e0d71e6e2405b83fd4c1f7b3e2cfc2e9d50823d4")]
 [assembly: InternalsVisibleTo("Apache.Ignite.AspNet.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c9380ce05eb74bd7c531f72e9ea615c59d7eceb09bd9795cb3dff1fcf638fd799c2a58a9be42fff156efe1c8cdebb751e27763f6c9a7c80cdc1dc1bbf44283608ef18ccd5017fd57b2b026503637c89c2537f361807f3bdd49265f4d444716159d989342561d324b1a0961640338bb32eaf67f4ae0c95f1b210f65404b0909c6")]
 [assembly: InternalsVisibleTo("Apache.Ignite, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3e6312f7ca1ab31b8ac8408668fc85b4a76a689f7eef8553d491a594cd9ea29432b7aea12ed8f34925b2db1e01fa64f333c4e8866252a2b2d512afa5d2e06eef94fb2cdd05904f2ad70d3752fbf531bef128ecad9e699f54b2cfcd0b394b7b40e33b8c7ed45a2cd300e1b4d01c8ec7fd753683594a18f396727c304920a5e97")]
-#if NETCOREAPP2_0 ||  NETCOREAPP3_0
+#if NETCOREAPP
 [assembly: InternalsVisibleTo("Apache.Ignite.Core.Tests.DotNetCore, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c9b65cf83e050e9d360a840fc6632774936ea62a9a14db0aa1b991ac6b7c94030a647be9755d6b3b5883367c58cb834866b4f3acbdb5881dff677f2c046ed7cae85c9a62a7737f377813ebe4ae19f89d357e811aa577c909b82d5f02a9b05dab39da3ff92927ce0b0c4d0204961ee5d5c329274b68f19ebba129ee8e3fd0d0c1")]
 #endif
 #endif
diff --git a/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln b/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln
index 45dfe55..db06969 100644
--- a/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln
+++ b/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln
@@ -7,14 +7,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Apache.Ignite.Core.DotNetCo
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Apache.Ignite.Linq.DotNetCore", "Apache.Ignite.Linq\Apache.Ignite.Linq.DotNetCore.csproj", "{5ED9F0FA-C371-49B5-AB5B-C4038F83E2DB}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Apache.Ignite.Core.Tests.DotNetCore", "Apache.Ignite.Core.Tests.DotNetCore\Apache.Ignite.Core.Tests.DotNetCore.csproj", "{700215D4-60E8-4DB2-923F-D4F4D95CBD95}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apache.Ignite.DotNetCore", "Apache.Ignite\Apache.Ignite.DotNetCore.csproj", "{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apache.Ignite.Benchmarks.DotNetCore", "Apache.Ignite.Benchmarks\Apache.Ignite.Benchmarks.DotNetCore.csproj", "{4344AEB8-6772-4625-9445-2C4A224B7716}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apache.Ignite.BenchmarkDotNet", "Apache.Ignite.BenchmarkDotNet\Apache.Ignite.BenchmarkDotNet.csproj", "{4ACD0487-0774-4705-8245-8D4F36A2F963}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apache.Ignite.Core.Tests.DotNetCore", "Apache.Ignite.Core.Tests\Apache.Ignite.Core.Tests.DotNetCore.csproj", "{54BDA92C-8551-4E42-A73B-F55EE883E537}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -29,10 +29,6 @@ Global
 		{5ED9F0FA-C371-49B5-AB5B-C4038F83E2DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{5ED9F0FA-C371-49B5-AB5B-C4038F83E2DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{5ED9F0FA-C371-49B5-AB5B-C4038F83E2DB}.Release|Any CPU.Build.0 = Release|Any CPU
-		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Release|Any CPU.Build.0 = Release|Any CPU
 		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -45,6 +41,10 @@ Global
 		{4ACD0487-0774-4705-8245-8D4F36A2F963}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{4ACD0487-0774-4705-8245-8D4F36A2F963}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{4ACD0487-0774-4705-8245-8D4F36A2F963}.Release|Any CPU.Build.0 = Release|Any CPU
+		{54BDA92C-8551-4E42-A73B-F55EE883E537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{54BDA92C-8551-4E42-A73B-F55EE883E537}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{54BDA92C-8551-4E42-A73B-F55EE883E537}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{54BDA92C-8551-4E42-A73B-F55EE883E537}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/MethodVisitor.cs b/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/MethodVisitor.cs
index c7aebb9..5771f88 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/MethodVisitor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/MethodVisitor.cs
@@ -67,6 +67,11 @@ namespace Apache.Ignite.Linq.Impl
             GetParameterizedTrimMethod("Trim", "trim"),
             GetParameterizedTrimMethod("TrimStart", "ltrim"),
             GetParameterizedTrimMethod("TrimEnd", "rtrim"),
+#if NETCOREAPP
+            GetCharTrimMethod("Trim", "trim"),
+            GetCharTrimMethod("TrimStart", "ltrim"),
+            GetCharTrimMethod("TrimEnd", "rtrim"),
+#endif
             GetStringMethod("Replace", "replace", typeof(string), typeof(string)),
             GetStringMethod("PadLeft", "lpad", typeof (int)),
             GetStringMethod("PadLeft", "lpad", typeof (int), typeof (char)),
@@ -253,22 +258,30 @@ namespace Apache.Ignite.Linq.Impl
                 if (arg.NodeType == ExpressionType.Constant)
                 {
                     var constant = (ConstantExpression) arg;
-                    var args = constant.Value as IEnumerable<char>;
 
-                    if (args == null)
+                    if (constant.Value is char)
                     {
-                        throw new NotSupportedException("String.Trim function only supports IEnumerable<char>");
+                        visitor.AppendParameter((char) constant.Value);
                     }
+                    else
+                    {
+                        var args = constant.Value as IEnumerable<char>;
 
-                    var enumeratedArgs = args.ToArray();
+                        if (args == null)
+                        {
+                            throw new NotSupportedException("String.Trim function only supports IEnumerable<char>");
+                        }
 
-                    if (enumeratedArgs.Length != 1)
-                    {
-                        throw new NotSupportedException("String.Trim function only supports a single argument: " +
-                                                        expression);
-                    }
+                        var enumeratedArgs = args.ToArray();
 
-                    visitor.AppendParameter(enumeratedArgs[0]);
+                        if (enumeratedArgs.Length != 1)
+                        {
+                            throw new NotSupportedException("String.Trim function only supports a single argument: " +
+                                                            expression);
+                        }
+
+                        visitor.AppendParameter(enumeratedArgs[0]);
+                    }
                 }
                 else
                 {
@@ -364,6 +377,18 @@ namespace Apache.Ignite.Linq.Impl
                 (e, v) => VisitParameterizedTrimFunc(e, v, sqlName));
         }
 
+#if NETCOREAPP
+        /// <summary>
+        /// Gets string parameterized Trim(TrimStart, TrimEnd) method that takes a single char.
+        /// </summary>
+        private static KeyValuePair<MethodInfo, VisitMethodDelegate> GetCharTrimMethod(string name,
+            string sqlName)
+        {
+            return GetMethod(typeof(string), name, new[] {typeof(char)},
+                (e, v) => VisitParameterizedTrimFunc(e, v, sqlName));
+        }
+#endif
+        
         /// <summary>
         /// Gets the math method.
         /// </summary>
diff --git a/modules/platforms/dotnet/DEVNOTES.txt b/modules/platforms/dotnet/DEVNOTES.txt
index dcfaaf7..36c901f 100644
--- a/modules/platforms/dotnet/DEVNOTES.txt
+++ b/modules/platforms/dotnet/DEVNOTES.txt
@@ -16,8 +16,8 @@ Building binaries:
 Resulting binaries will be in bin folder, and NuGet packages in nupkg folder.
 
 Running built binaries: resulting "bin" folder is self contained, you can copy it anywhere and run
-  bin\Apache.Ignite.exe  
-  
+  bin\Apache.Ignite.exe
+
 Running examples and Apache.Ignite.exe from project directories:
   Set IGNITE_NATIVE_TEST_CLASSPATH environment variable to "true"
 
@@ -31,7 +31,7 @@ However, this does not prevent us from supporting .NET Standard 2.0 and .NET Cor
 because of ".NET Framework compatibility mode", which allows referencing any libraries
 from .NET Core 2.0 projects. So we release binaries which target .NET 4.0, and they work
 both with .NET 4.0+ and .NET Core 2.0+.
-  
+
 
 Cross-Platform Development with .NET Core (Linux, macOS)
 ========================================
@@ -40,19 +40,19 @@ Ignite.NET can be built, developed, and tested with .NET Core on Linux and macOS
 A subset of functionality and tests is available. See Apache.Ignite.DotNetCore.sln.
 
 Requirements:
-* .NET Core SDK (2.1.4+): https://www.microsoft.com/net/download/linux
-* JDK 8+: sudo apt-get install default-jdk
-* Maven: sudo apt-get install maven
-* IDE: Not required. Rider is recommended. VSCode works, but has issues with tests.
+* .NET Core SDK (2.1+): https://www.microsoft.com/net/download/linux
+* JDK 8+: apt install openjdk-8-jdk
+* Maven: apt install maven
+* IDE: Not required. Rider or VSCode works.
 
 Getting started:
 * Build Java and .NET:
   ./build.sh
 * Run tests:
-  cd Apache.Ignite.Core.Tests.DotNetCore
-  dotnet test --logger "console;verbosity=detailed"
+  cd Apache.Ignite.Core.Tests
+  dotnet test Apache.Ignite.Core.Tests.DotNetCore.csproj
 * Run specific test:
-  dotnet test --filter CacheTest --logger "console;verbosity=detailed"
+  dotnet test Apache.Ignite.Core.Tests.DotNetCore.csproj --filter CacheTest
 * IDE: Open Apache.Ignite.DotNetCore.sln
 
 
@@ -63,14 +63,14 @@ Full Ignite.NET solution can be built, developed, and tested with Mono.
 
 Requirements:
 * Mono: http://www.mono-project.com/download/ (6.x may not work due to https://github.com/mono/mono/issues/18418)
-* NuGet: sudo apt-get install nuget
-* JDK: sudo apt-get install default-jdk
-* Maven: sudo apt-get install maven
+* NuGet: apt install nuget
+* JDK 8+: apt install openjdk-8-jdk
+* Maven: apt install maven
 * PowerShell Core: https://github.com/PowerShell/PowerShell
-* IDE: Not required. Rider is recommended, MonoDevelop also works.
+* IDE: Not required.
 
 Getting started:
 * Build Java and .NET:
   pwsh ./build.ps1 -skipDotNetCore
-* Run tests: 
+* Run tests:
   mono Apache.Ignite.Core.Tests/bin/Debug/Apache.Ignite.Core.Tests.exe -basicTests
diff --git a/modules/platforms/dotnet/README.txt b/modules/platforms/dotnet/README.txt
deleted file mode 100644
index 7521dfe..0000000
--- a/modules/platforms/dotnet/README.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-Apache Ignite.NET
-==================================
-
-Apache Ignite.NET provides a full featured .NET data grid and .NET compute grid functionality.
-Using Apache Ignite.NET APIs you can execute any computation closure on the grid,
-perform concurrent operations on the data stored in cache, start ACID transactions,
-create distributed locks, subscribe for event listeners, etc.
-
-Files list:
-
- * Apache.Ignite.exe - executable to start standalone Ignite.NET node.
- * Apache.Ignite.exe.config - standalone node configuration file.
- * Apache.Ignite.Core.dll - Ignite.NET API library.
- * Apache.Ignite.Core.xml - Library XML documentation.
- * Apache.Ignite.Linq.dll - Ignite LINQ Provider library.
- * Apache.Ignite.AspNet.dll - Ignite ASP.NET integration.
- * Apache.Ignite.NLog.dll - Ignite NLog logger.
- * Apache.Ignite.Log4Net.dll - Ignite Log4Net logger.
- * IgniteConfigurationSection.xsd - Configuration XML schema.
-
-
-Development
-
- * Download and install Microsoft Visual Studio C# 2010 or later:
-   https://www.visualstudio.com/
-   
- * Download and install Microsoft Visual C++ 2010 Redistributable Package: 
-   http://www.microsoft.com/en-us/download/details.aspx?id=14632
-   
- * Download and install the latest Java Runtime Environment:
-   https://java.com/en/download/index.jsp
- 
- * Add Apache.Ignite.Core.dll to your project references.
-
- * To start Apache Ignite as a standalone node or Windows service use Apache.Ignite.exe.
-
-Links
-
- * Documentation center: https://apacheignite-net.readme.io/
\ No newline at end of file
diff --git a/modules/platforms/dotnet/build.sh b/modules/platforms/dotnet/build.sh
index 66d3852..0bcd697 100755
--- a/modules/platforms/dotnet/build.sh
+++ b/modules/platforms/dotnet/build.sh
@@ -29,6 +29,5 @@ cd ../../..
 mvn clean package -DskipTests -Dmaven.javadoc.skip=true -Plgpl,-examples,-clean-libs,-release,-scala,-clientDocs
 popd
 
-# Build .NET
-cd Apache.Ignite.Core.Tests.DotNetCore
-dotnet build
+# Build .NET.
+dotnet build Apache.Ignite.DotNetCore.sln