You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by is...@apache.org on 2019/01/23 09:45:05 UTC

[ignite] branch master updated: IGNITE-8310: C++ project may now be compiled with newer boost version

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

isapego 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 09dc88b  IGNITE-8310: C++ project may now be compiled with newer boost version
09dc88b is described below

commit 09dc88bb5add485e9385db92b18b7dcd804ba911
Author: Igor Sapego <is...@apache.org>
AuthorDate: Wed Jan 23 12:43:13 2019 +0300

    IGNITE-8310: C++ project may now be compiled with newer boost version
    
    This closes #5638
---
 modules/platforms/cpp/DEVNOTES.txt                 |  50 +++-
 .../cpp/binary/include/ignite/binary/binary_type.h |   2 +-
 modules/platforms/cpp/core-test/Makefile.am        |   6 +-
 .../cpp/core-test/include/ignite/test_utils.h      |   8 +
 .../cpp/core-test/include/teamcity_messages.h      |  48 ++--
 .../cpp/core-test/project/vs/core-test.vcxproj     |  13 +-
 .../src/binary_identity_resolver_test.cpp          |   4 -
 .../cpp/core-test/src/binary_object_test.cpp       |  16 +-
 .../src/binary_reader_writer_raw_test.cpp          |   6 +-
 .../core-test/src/binary_reader_writer_test.cpp    |   6 +-
 .../cpp/core-test/src/binary_session_test.cpp      |   6 +-
 modules/platforms/cpp/core-test/src/bits_test.cpp  |   6 +-
 .../cpp/core-test/src/cache_invoke_test.cpp        |   4 -
 .../cpp/core-test/src/cache_query_test.cpp         |  22 +-
 .../cpp/core-test/src/cache_store_test.cpp         |   8 +-
 modules/platforms/cpp/core-test/src/cache_test.cpp |   6 +-
 .../platforms/cpp/core-test/src/cluster_test.cpp   |   6 +-
 .../platforms/cpp/core-test/src/compute_test.cpp   |  60 ++---
 .../cpp/core-test/src/concurrent_test.cpp          |   6 +-
 .../cpp/core-test/src/continuous_query_test.cpp    |   6 +-
 .../platforms/cpp/core-test/src/date_time_test.cpp |   4 -
 .../platforms/cpp/core-test/src/decimal_test.cpp   |   4 -
 .../cpp/core-test/src/dynamic_size_array_test.cpp  |   6 +-
 .../cpp/core-test/src/fixed_size_array_test.cpp    |   6 +-
 .../platforms/cpp/core-test/src/future_test.cpp    |   6 +-
 .../cpp/core-test/src/handle_registry_test.cpp     |   6 +-
 .../cpp/core-test/src/ignite_error_test.cpp        |   6 +-
 .../platforms/cpp/core-test/src/ignition_test.cpp  |   6 +-
 .../cpp/core-test/src/interop_memory_test.cpp      |   4 -
 .../platforms/cpp/core-test/src/interop_test.cpp   |   4 -
 .../platforms/cpp/core-test/src/reference_test.cpp |   4 -
 .../platforms/cpp/core-test/src/teamcity_boost.cpp | 300 ++++++++++++++-------
 .../cpp/core-test/src/teamcity_messages.cpp        | 250 ++++++++++-------
 modules/platforms/cpp/core-test/src/test_utils.cpp |   2 +
 .../cpp/core-test/src/transactions_test.cpp        |  60 ++---
 modules/platforms/cpp/odbc-test/Makefile.am        |   6 +-
 .../cpp/odbc-test/include/sql_test_suite_fixture.h |   4 -
 .../odbc-test/include/teamcity/teamcity_messages.h |  36 +--
 .../platforms/cpp/odbc-test/include/test_utils.h   |   8 +
 .../cpp/odbc-test/project/vs/odbc-test.vcxproj     |  11 +-
 .../cpp/odbc-test/src/api_robustness_test.cpp      |   4 -
 .../odbc-test/src/application_data_buffer_test.cpp |   4 -
 .../cpp/odbc-test/src/attributes_test.cpp          |   4 -
 .../cpp/odbc-test/src/authentication_test.cpp      |   4 -
 .../platforms/cpp/odbc-test/src/column_test.cpp    |   4 -
 .../cpp/odbc-test/src/configuration_test.cpp       |   4 -
 .../cpp/odbc-test/src/connection_info_test.cpp     |   6 +-
 .../cpp/odbc-test/src/connection_test.cpp          |   4 -
 .../platforms/cpp/odbc-test/src/cursor_test.cpp    |   6 +-
 .../platforms/cpp/odbc-test/src/errors_test.cpp    |   4 -
 .../cpp/odbc-test/src/meta_queries_test.cpp        |   4 -
 .../cpp/odbc-test/src/odbc_test_suite.cpp          |  42 ++-
 .../platforms/cpp/odbc-test/src/parser_test.cpp    |   6 +-
 .../cpp/odbc-test/src/queries_ssl_test.cpp         |   4 -
 .../platforms/cpp/odbc-test/src/queries_test.cpp   |  13 +-
 modules/platforms/cpp/odbc-test/src/row_test.cpp   |   4 -
 .../odbc-test/src/sql_aggregate_functions_test.cpp |   4 -
 .../odbc-test/src/sql_date_time_functions_test.cpp |   4 -
 .../src/sql_esc_convert_function_test.cpp          |   4 -
 .../cpp/odbc-test/src/sql_get_info_test.cpp        |   4 -
 .../odbc-test/src/sql_numeric_functions_test.cpp   |   4 -
 .../cpp/odbc-test/src/sql_operators_test.cpp       |   4 -
 .../cpp/odbc-test/src/sql_outer_join_test.cpp      |   4 -
 .../cpp/odbc-test/src/sql_parsing_test.cpp         |   4 -
 .../odbc-test/src/sql_string_functions_test.cpp    |   4 -
 .../odbc-test/src/sql_system_functions_test.cpp    |   4 -
 .../platforms/cpp/odbc-test/src/sql_types_test.cpp |   4 -
 .../odbc-test/src/sql_value_expressions_test.cpp   |   4 -
 .../platforms/cpp/odbc-test/src/streaming_test.cpp |   7 -
 .../cpp/odbc-test/src/teamcity/teamcity_boost.cpp  | 292 ++++++++++++++------
 .../odbc-test/src/teamcity/teamcity_messages.cpp   | 246 ++++++++++-------
 modules/platforms/cpp/odbc-test/src/test_utils.cpp |   2 +
 .../cpp/odbc-test/src/transaction_test.cpp         |   4 -
 modules/platforms/cpp/odbc-test/src/types_test.cpp |   4 -
 .../platforms/cpp/odbc-test/src/utility_test.cpp   |   6 +-
 modules/platforms/cpp/thin-client-test/Makefile.am |   8 +-
 .../include/teamcity/teamcity_messages.h           |  42 +--
 .../cpp/thin-client-test/include/test_utils.h      |   8 +
 .../project/vs/thin-client-test.vcxproj            |  13 +-
 .../cpp/thin-client-test/src/auth_test.cpp         |   4 -
 .../cpp/thin-client-test/src/cache_client_test.cpp |   4 -
 .../thin-client-test/src/ignite_client_test.cpp    |   4 -
 .../cpp/thin-client-test/src/ssl_test.cpp          |   4 -
 .../src/teamcity/teamcity_boost.cpp                | 300 ++++++++++++++-------
 .../src/teamcity/teamcity_messages.cpp             | 250 ++++++++++-------
 .../cpp/thin-client-test/src/test_utils.cpp        |   2 +
 86 files changed, 1359 insertions(+), 1028 deletions(-)

diff --git a/modules/platforms/cpp/DEVNOTES.txt b/modules/platforms/cpp/DEVNOTES.txt
index 132d163..5a21783 100644
--- a/modules/platforms/cpp/DEVNOTES.txt
+++ b/modules/platforms/cpp/DEVNOTES.txt
@@ -23,6 +23,7 @@ Common Requirements:
    building a driver.
 
 Building the Apache Ignite C++ components:
+
  * Navigate to the directory $IGNITE_HOME/platforms/cpp
  * Execute the following commands one by one to build the project:
     * libtoolize && aclocal && autoheader && automake --add-missing && autoreconf
@@ -35,14 +36,14 @@ Ignite-specific options:
  * --enable-core - build Ignite core library. Enabled by default.
  * --enable-thin-client - build thin client library. Enabled by default.
  * --enable-node - build stand-alone node executable. Enabled by default.
- 
+
 If you only need to build ODBC driver and do not want to build anything else you may just
 use configure script with the following arguments:
  ./configure --enable-odbc --disable-core --disable-thin-client --disable-node
 
 With the config like that you should not have any ignite dependencies as jvm.dll installed
 to build ODBC driver.
- 
+
 Similarly if you only want to build only thin client you may use configure script with
 the following arguments:
  ./configure --disable-core --disable-node
@@ -50,6 +51,18 @@ the following arguments:
 NOTE: You may want to use "make install" command to install Ignite libraries and headers
 for your operation system. Note however that this action may require superuser privileges.
 
+Building tests:
+
+Boost framework is required to build tests. The following boost libraries are used:
+ * boost_unit_test_framework
+ * boost_thread
+ * boost_system
+ * boost_chrono
+
+Ignite expects for boost libraries and header to be found under default system paths, so
+it is recommended to use package repository for your OS to install boost package for the
+development.
+
 Building on Windows with Visual Studio (tm)
 ----------------------------------
 
@@ -68,8 +81,38 @@ Building binaries:
  * If you want to build ODBC driver then you should explicitly build it as it is disabled
    in the solution file by default. In IDE it can be done by clicking on the ODBC project
    with the right mouse button and choosing "Build" option.
-   
+
+Building tests:
+
+Boost framework is required to build tests. The following boost libraries are used:
+ * boost_unit_test_framework
+ * boost_thread
+ * boost_system
+ * boost_chrono
+
+You may either download boost with pre-built libraries or download source code and build
+it by yourself. The details can be found by the following web link:
+https://www.boost.org/doc/libs/1_68_0/more/getting_started/windows.html
+
+It is also required to set following enviroment variables for Visual Studio solution to
+be able to locate boost libraries:
+ * BOOST_HOME - path to the directory that contains "boost" directory with header files.
+ * BOOST_LIB64_PATH - path to the directory that contains 64-bit libraries. Only requred
+   to build 64-bit Ignite libraries.
+ * BOOST_LIB32_PATH - path to the directory that contains 32-bit libraries. Only requred
+   to build 32-bit Ignite libraries.
+ * BOOST_LIB_SUFIX_D32 - sufix for debug 32-bit boost liraries. For example for library
+   'libboost_chrono-vc100-mt-gd-x32-1_68.lib' the sufix is 'vc100-mt-gd-x32-1_68'.
+ * BOOST_LIB_SUFIX_R32 - sufix for release 32-bit boost liraries. For example for library
+   'libboost_system-vc141-mt-x32-1_68.lib' the sufix is 'vc141-mt-x32-1_68'.
+ * BOOST_LIB_SUFIX_D64 - sufix for debug 64-bit boost liraries. For example for library
+   'libboost_unit_test_framework-vc140-mt-gd-x64-1_68.lib' the sufix is
+   'vc140-mt-gd-x64-1_68'.
+ * BOOST_LIB_SUFIX_R64 - sufix for release 64-bit boost liraries. For example for library
+   'libboost_thread-vc100-mt-1_58.lib' the sufix is 'vc100-mt-1_58'.
+
 Building installers:
+
  * Install WiX Toolset if you do not have it yet.
  * Add WiX Toolset "bin" directory to your PATH environmental variable.
  * Build ODBC drivers: Release|x64 for 64-bit version and Release|Win32 for 32-bit version.
@@ -82,6 +125,7 @@ Building installers:
     * light.exe -ext WixUIExtension ignite-odbc-amd64.wixobj
 
 Building in later versions of Visual Studio:
+
  * Open project\vs\ignite.sln or project\vs\ignite_86.sln in Visual Studio
  * You will be prompted to "Update VC++ Compiler and Libraries", click "Update"
  * Build the solution.
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
index 749404a..14a95b6 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
@@ -91,7 +91,7 @@ static int32_t GetFieldId(const char* name) \
  * Implementation of IsNull() function which always returns false.
  */
 #define IGNITE_BINARY_IS_NULL_FALSE(T) \
-static bool IsNull(const T& obj) \
+static bool IsNull(const T&) \
 { \
     return false; \
 }
diff --git a/modules/platforms/cpp/core-test/Makefile.am b/modules/platforms/cpp/core-test/Makefile.am
index f87effd..7c3757c 100644
--- a/modules/platforms/cpp/core-test/Makefile.am
+++ b/modules/platforms/cpp/core-test/Makefile.am
@@ -35,7 +35,8 @@ AM_CPPFLAGS = \
 	-I$(JAVA_HOME)/include/linux \
 	-DIGNITE_IMPL \
 	-D__STDC_LIMIT_MACROS \
-	-D__STDC_CONSTANT_MACROS
+	-D__STDC_CONSTANT_MACROS \
+	-DBOOST_TEST_DYN_LINK
 
 AM_CXXFLAGS = \
 	-Wall \
@@ -46,7 +47,8 @@ ignite_tests_LDADD = \
 	-lpthread \
 	-lboost_thread \
 	-lboost_system \
-	-lboost_chrono
+	-lboost_chrono \
+	-lboost_unit_test_framework
 
 ignite_tests_LDFLAGS = \
 	-static-libtool-libs \
diff --git a/modules/platforms/cpp/core-test/include/ignite/test_utils.h b/modules/platforms/cpp/core-test/include/ignite/test_utils.h
index aa91458..4c10b6e 100644
--- a/modules/platforms/cpp/core-test/include/ignite/test_utils.h
+++ b/modules/platforms/cpp/core-test/include/ignite/test_utils.h
@@ -20,6 +20,14 @@
 
 #include "ignite/ignition.h"
 
+#define MUTE_TEST_FOR_TEAMCITY \
+    if (jetbrains::teamcity::underTeamcity()) \
+    { \
+        BOOST_TEST_MESSAGE("Muted on TeamCity because of periodical non-critical failures"); \
+        BOOST_CHECK(jetbrains::teamcity::underTeamcity()); \
+        return; \
+    }
+
 namespace ignite_test
 {
     enum
diff --git a/modules/platforms/cpp/core-test/include/teamcity_messages.h b/modules/platforms/cpp/core-test/include/teamcity_messages.h
index 8cf23d0..f1f20e5 100644
--- a/modules/platforms/cpp/core-test/include/teamcity_messages.h
+++ b/modules/platforms/cpp/core-test/include/teamcity_messages.h
@@ -1,11 +1,11 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,35 +21,35 @@
 #include <string>
 #include <iostream>
 
-namespace JetBrains {
+namespace jetbrains { namespace teamcity {
 
 std::string getFlowIdFromEnvironment();
 bool underTeamcity();
 
-class TeamcityMessages {
-    std::ostream *m_out;
-    
-protected:
-    std::string escape(std::string s);
-
-    void openMsg(const std::string &name);
-    void writeProperty(std::string name, std::string value);
-    void closeMsg();
+class TeamcityMessages
+{
+    std::ostream* m_out;
 
 public:
+    static const bool StdErr = true;
+    static const bool StdOut = false;
+
     TeamcityMessages();
-    
-    void setOutput(std::ostream &);
-    
-    void suiteStarted(std::string name, std::string flowid = "");
-    void suiteFinished(std::string name, std::string flowid = "");
-    
-    void testStarted(std::string name, std::string flowid = "");
-    void testFailed(std::string name, std::string message, std::string details, std::string flowid = "");
-    void testIgnored(std::string name, std::string message, std::string flowid = "");
-    void testFinished(std::string name, int durationMs = -1, std::string flowid = "");    
+
+    void setOutput(std::ostream&);
+
+    void suiteStarted(const std::string& name, const std::string& flowid = std::string());
+    void suiteFinished(const std::string& name, const std::string& flowid = std::string());
+
+    void testStarted(const std::string& name, const std::string& flowid = std::string(), bool captureStandardOutput = false);
+    void testFinished(const std::string& name, int durationMs = -1, const std::string& flowid = std::string());
+
+    void testFailed(const std::string& name, const std::string& message, const std::string& details, const std::string& flowid = std::string());
+    void testIgnored(const std::string& name, const std::string& message, const std::string& flowid = std::string());
+
+    void testOutput(const std::string& name, const std::string& output, const std::string& flowid, bool isStdErr = StdOut);
 };
 
-}
+}} // namespace teamcity, jetbrains
 
 #endif /* H_TEAMCITY_MESSAGES */
diff --git a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
index f8dee2f..719fa38 100644
--- a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
+++ b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
@@ -162,7 +162,7 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(BOOST_HOME)\lib64-msvc-10.0\libboost_unit_test_framework-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_thread-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_system-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_chrono-vc100-mt-gd-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB64_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_system-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_D64).lib;%(AdditionalDependencies)</AdditionalDependencies>
       <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
@@ -177,7 +177,8 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(BOOST_HOME)\lib32-msvc-10.0\libboost_unit_test_framework-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_thread-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_system-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_chrono-vc100-mt-gd-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB32_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_system-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_D32).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -195,7 +196,8 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>$(BOOST_HOME)\lib64-msvc-10.0\libboost_unit_test_framework-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_thread-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_system-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_chrono-vc100-mt-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB64_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_system-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_R64).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -213,10 +215,11 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>$(BOOST_HOME)\lib32-msvc-10.0\libboost_unit_test_framework-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_thread-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_system-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_chrono-vc100-mt-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB32_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_system-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_R32).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp b/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
index dd1e790..db1ddca 100644
--- a/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <sstream>
 
 #include <boost/test/unit_test.hpp>
diff --git a/modules/platforms/cpp/core-test/src/binary_object_test.cpp b/modules/platforms/cpp/core-test/src/binary_object_test.cpp
index 23fc6b1..3abd26a 100644
--- a/modules/platforms/cpp/core-test/src/binary_object_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_object_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/utils.h>
@@ -325,22 +321,22 @@ BOOST_AUTO_TEST_CASE(RemoteSchemaRetrieval)
 {
     try
     {
-        BOOST_CHECKPOINT("Node1 startup");
+        BOOST_TEST_CHECKPOINT("Node1 startup");
 #ifdef IGNITE_TESTS_32
         Ignite node1 = ignite_test::StartNode("cache-test-32.xml", "node1");
 #else
         Ignite node1 = ignite_test::StartNode("cache-test.xml", "node1");
 #endif
 
-        BOOST_CHECKPOINT("Creating cache");
+        BOOST_TEST_CHECKPOINT("Creating cache");
         cache::Cache<int32_t, BinaryFields> cache = node1.GetOrCreateCache<int32_t, BinaryFields>("cache");
 
         BinaryFields some(25675472, 67461, 457542, 87073456);
 
-        BOOST_CHECKPOINT("Putting value");
+        BOOST_TEST_CHECKPOINT("Putting value");
         cache.Put(42, some);
 
-        BOOST_CHECKPOINT("Node2 startup");
+        BOOST_TEST_CHECKPOINT("Node2 startup");
 #ifdef IGNITE_TESTS_32
         Ignite node2 = ignite_test::StartNode("cache-test-32.xml", "node2");
 #else
@@ -353,7 +349,7 @@ BOOST_AUTO_TEST_CASE(RemoteSchemaRetrieval)
         InteropUnpooledMemory mem(1024);
         FillMem<BinaryFields>(mem, some);
 
-        BOOST_CHECKPOINT("Creating BinaryObject");
+        BOOST_TEST_CHECKPOINT("Creating BinaryObject");
         BinaryObject binObj(mem, 0, 0, env->GetTypeManager());
 
         BOOST_CHECK(binObj.HasField("val1"));
@@ -393,4 +389,4 @@ BOOST_AUTO_TEST_CASE(GetEnumValueInvalid)
     BOOST_CHECK_THROW(binObj.GetEnumValue(), IgniteError);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp b/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
index 10a0bb2..65c7ef3 100644
--- a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/impl/interop/interop.h"
@@ -1315,4 +1311,4 @@ BOOST_AUTO_TEST_CASE(TestPrimitivePointers)
     BOOST_CHECK_EQUAL(*field2Res, field2);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp b/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
index b76bcc1..643840d 100644
--- a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <memory>
 
 #include <boost/test/unit_test.hpp>
@@ -2026,4 +2022,4 @@ BOOST_AUTO_TEST_CASE(TestPrimitivePointers)
     BOOST_CHECK_EQUAL(*field2Res, field2);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/binary_session_test.cpp b/modules/platforms/cpp/core-test/src/binary_session_test.cpp
index 08bc1eb..8cb2945 100644
--- a/modules/platforms/cpp/core-test/src/binary_session_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_session_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/impl/interop/interop.h"
@@ -310,4 +306,4 @@ BOOST_AUTO_TEST_CASE(TestPointer)
     delete readVal;
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/bits_test.cpp b/modules/platforms/cpp/core-test/src/bits_test.cpp
index 3aadf36..33d3ef1 100644
--- a/modules/platforms/cpp/core-test/src/bits_test.cpp
+++ b/modules/platforms/cpp/core-test/src/bits_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/bits.h>
@@ -121,4 +117,4 @@ BOOST_AUTO_TEST_CASE(TestBitCount)
     }
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/cache_invoke_test.cpp b/modules/platforms/cpp/core-test/src/cache_invoke_test.cpp
index 55fca85..5c6f214 100644
--- a/modules/platforms/cpp/core-test/src/cache_invoke_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_invoke_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
-#endif
-
 #include <sstream>
 #include <algorithm>
 
diff --git a/modules/platforms/cpp/core-test/src/cache_query_test.cpp b/modules/platforms/cpp/core-test/src/cache_query_test.cpp
index d5a3617..457e179 100644
--- a/modules/platforms/cpp/core-test/src/cache_query_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_query_test.cpp
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
+#include <stdint.h>
 
 #include <sstream>
 #include <iterator>
@@ -761,7 +759,7 @@ struct CacheQueryTestSuiteFixture
         Cache<int, QueryPerson> cache = GetPersonCache();
 
         // Test query with two fields of different type.
-        SqlFieldsQuery qry("select name, age from QueryPerson");
+        SqlFieldsQuery qry("select name, age from QueryPerson order by age");
 
         QueryFieldsCursor cursor = cache.Query(qry);
         CheckEmpty(cursor);
@@ -805,12 +803,12 @@ struct CacheQueryTestSuiteFixture
             std::string name = row.GetNext<std::string>(error);
             BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
 
-            BOOST_REQUIRE(name == expected_name);
+            BOOST_REQUIRE_EQUAL(name, expected_name);
 
             int age = row.GetNext<int>(error);
             BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
 
-            BOOST_REQUIRE(age == expected_age);
+            BOOST_REQUIRE_EQUAL(age, expected_age);
 
             BOOST_REQUIRE(!row.HasNext());
         }
@@ -964,8 +962,7 @@ BOOST_AUTO_TEST_CASE(TestSqlQuery)
  */
 BOOST_AUTO_TEST_CASE(TestSqlQueryDistributedJoins)
 {
-    if (JetBrains::underTeamcity())
-        return;
+    MUTE_TEST_FOR_TEAMCITY;
 
     Cache<int, QueryPerson> cache1 = GetPersonCache();
     Cache<int, QueryRelation> cache2 = GetRelationCache();
@@ -1245,8 +1242,7 @@ BOOST_AUTO_TEST_CASE(TestSqlFieldsQueryBasic)
  */
 BOOST_AUTO_TEST_CASE(TestSqlFieldsQueryDistributedJoins)
 {
-    if (JetBrains::underTeamcity())
-        return;
+    MUTE_TEST_FOR_TEAMCITY;
 
     Cache<int, QueryPerson> cache1 = GetPersonCache();
     Cache<int, QueryRelation> cache2 = GetRelationCache();
@@ -1456,7 +1452,7 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySeveral)
     Cache<int, QueryPerson> cache = GetPersonCache();
 
     // Test query with two fields of different type.
-    SqlFieldsQuery qry("select name, age from QueryPerson");
+    SqlFieldsQuery qry("select name, age from QueryPerson order by age");
 
     QueryFieldsCursor cursor = cache.Query(qry);
     CheckEmpty(cursor);
@@ -1500,12 +1496,12 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySeveral)
         std::string name = row.GetNext<std::string>(error);
         BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
 
-        BOOST_REQUIRE(name == expected_name);
+        BOOST_REQUIRE_EQUAL(name, expected_name);
 
         int age = row.GetNext<int>(error);
         BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
 
-        BOOST_REQUIRE(age == expected_age);
+        BOOST_REQUIRE_EQUAL(age, expected_age);
 
         BOOST_REQUIRE(!row.HasNext());
     }
diff --git a/modules/platforms/cpp/core-test/src/cache_store_test.cpp b/modules/platforms/cpp/core-test/src/cache_store_test.cpp
index 3571514..bff260c 100644
--- a/modules/platforms/cpp/core-test/src/cache_store_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_store_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/common/utils.h"
@@ -106,7 +102,7 @@ BOOST_AUTO_TEST_CASE(LoadCacheSingleNodeNoPredicate)
 
 BOOST_AUTO_TEST_CASE(LoadCacheSeveralNodesNoPredicate)
 {
-    BOOST_CHECKPOINT("Starting additional node");
+    BOOST_TEST_CHECKPOINT("Starting additional node");
 #ifdef IGNITE_TESTS_32
     Ignite node2 = ignite_test::StartNode("cache-store-32.xml", "node2");
 #else
@@ -157,4 +153,4 @@ BOOST_AUTO_TEST_CASE(LocalLoadCacheSingleNodeNoPredicate)
     BOOST_CHECK_EQUAL(val42, "42");
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/cache_test.cpp b/modules/platforms/cpp/core-test/src/cache_test.cpp
index 9cc657d..db09940 100644
--- a/modules/platforms/cpp/core-test/src/cache_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/cache/cache_peek_mode.h"
@@ -695,4 +691,4 @@ BOOST_AUTO_TEST_CASE(TestGetBigString)
     BOOST_REQUIRE(longStr == cache.Get(5));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/cluster_test.cpp b/modules/platforms/cpp/core-test/src/cluster_test.cpp
index cb64b6f..c47ba98 100644
--- a/modules/platforms/cpp/core-test/src/cluster_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cluster_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/ignition.h>
@@ -129,4 +125,4 @@ BOOST_AUTO_TEST_CASE(IgniteSetActive)
     BOOST_REQUIRE(node.IsActive());
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/compute_test.cpp b/modules/platforms/cpp/core-test/src/compute_test.cpp
index 57a55ae..0a873f5 100644
--- a/modules/platforms/cpp/core-test/src/compute_test.cpp
+++ b/modules/platforms/cpp/core-test/src/compute_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 #include <boost/chrono.hpp>
 #include <boost/thread.hpp>
@@ -339,7 +335,7 @@ BOOST_AUTO_TEST_CASE(IgniteCallSyncLocal)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Making Call");
+    BOOST_TEST_CHECKPOINT("Making Call");
     std::string res = compute.Call<std::string>(Func1(8, 5));
 
     BOOST_CHECK_EQUAL(res, "8.5");
@@ -349,12 +345,12 @@ BOOST_AUTO_TEST_CASE(IgniteCallAsyncLocal)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Making Call");
+    BOOST_TEST_CHECKPOINT("Making Call");
     Future<std::string> res = compute.CallAsync<std::string>(Func2(312, 245));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -366,7 +362,7 @@ BOOST_AUTO_TEST_CASE(IgniteCallSyncLocalError)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Making Call");
+    BOOST_TEST_CHECKPOINT("Making Call");
 
     BOOST_CHECK_EXCEPTION(compute.Call<std::string>(Func1(MakeTestError())), IgniteError, IsTestError);
 }
@@ -375,12 +371,12 @@ BOOST_AUTO_TEST_CASE(IgniteCallAsyncLocalError)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Making Call");
+    BOOST_TEST_CHECKPOINT("Making Call");
     Future<std::string> res = compute.CallAsync<std::string>(Func2(MakeTestError()));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -393,7 +389,7 @@ BOOST_AUTO_TEST_CASE(IgniteCallTestRemote)
     Ignite node2 = MakeNode("ComputeNode2");
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Making Call");
+    BOOST_TEST_CHECKPOINT("Making Call");
     compute.CallAsync<std::string>(Func2(8, 5));
 
     std::string res = compute.Call<std::string>(Func1(42, 24));
@@ -406,14 +402,14 @@ BOOST_AUTO_TEST_CASE(IgniteCallTestRemoteError)
     Ignite node2 = MakeNode("ComputeNode2");
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Making Call");
+    BOOST_TEST_CHECKPOINT("Making Call");
     compute.CallAsync<std::string>(Func2(8, 5));
 
     Future<std::string> res = compute.CallAsync<std::string>(Func2(MakeTestError()));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -425,7 +421,7 @@ BOOST_AUTO_TEST_CASE(IgniteRunSyncLocal)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Running");
+    BOOST_TEST_CHECKPOINT("Running");
     compute.Run(Func3(8, 5));
 
     BOOST_CHECK_EQUAL(Func3::res, "8.5");
@@ -435,12 +431,12 @@ BOOST_AUTO_TEST_CASE(IgniteRunAsyncLocal)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Running");
+    BOOST_TEST_CHECKPOINT("Running");
     Future<void> res = compute.RunAsync(Func3(312, 245));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -454,7 +450,7 @@ BOOST_AUTO_TEST_CASE(IgniteRunSyncLocalError)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Running");
+    BOOST_TEST_CHECKPOINT("Running");
 
     BOOST_CHECK_EXCEPTION(compute.Run(Func3(MakeTestError())), IgniteError, IsTestError);
 }
@@ -463,12 +459,12 @@ BOOST_AUTO_TEST_CASE(IgniteRunAsyncLocalError)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Running");
+    BOOST_TEST_CHECKPOINT("Running");
     Future<void> res = compute.RunAsync(Func3(MakeTestError()));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -481,7 +477,7 @@ BOOST_AUTO_TEST_CASE(IgniteRunRemote)
     Ignite node2 = MakeNode("ComputeNode2");
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Running");
+    BOOST_TEST_CHECKPOINT("Running");
     compute.CallAsync<std::string>(Func2(8, 5));
 
     compute.Run(Func3(42, 24));
@@ -494,14 +490,14 @@ BOOST_AUTO_TEST_CASE(IgniteRunRemoteError)
     Ignite node2 = MakeNode("ComputeNode2");
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Running");
+    BOOST_TEST_CHECKPOINT("Running");
     compute.CallAsync<std::string>(Func2(8, 5));
 
     Future<void> res = compute.RunAsync(Func3(MakeTestError()));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -513,7 +509,7 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastLocalSync)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Broadcasting");
+    BOOST_TEST_CHECKPOINT("Broadcasting");
     std::vector<std::string> res = compute.Broadcast<std::string>(Func2(8, 5));
 
     BOOST_CHECK_EQUAL(res.size(), 1);
@@ -524,12 +520,12 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastLocalAsync)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Broadcasting");
+    BOOST_TEST_CHECKPOINT("Broadcasting");
     Future< std::vector<std::string> > res = compute.BroadcastAsync<std::string>(Func2(312, 245));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -544,7 +540,7 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastSyncLocalError)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Broadcasting");
+    BOOST_TEST_CHECKPOINT("Broadcasting");
 
     BOOST_CHECK_EXCEPTION(compute.Broadcast(Func2(MakeTestError())), IgniteError, IsTestError);
 }
@@ -553,12 +549,12 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastAsyncLocalError)
 {
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Broadcasting");
+    BOOST_TEST_CHECKPOINT("Broadcasting");
     Future<void> res = compute.BroadcastAsync(Func2(MakeTestError()));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -571,7 +567,7 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastRemote)
     Ignite node2 = MakeNode("ComputeNode2");
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Broadcasting");
+    BOOST_TEST_CHECKPOINT("Broadcasting");
     std::vector<std::string> res = compute.Broadcast<std::string>(Func2(8, 5));
 
     BOOST_CHECK_EQUAL(res.size(), 2);
@@ -584,12 +580,12 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastRemoteError)
     Ignite node2 = MakeNode("ComputeNode2");
     Compute compute = node.GetCompute();
 
-    BOOST_CHECKPOINT("Broadcasting");
+    BOOST_TEST_CHECKPOINT("Broadcasting");
     Future< std::vector<std::string> > res = compute.BroadcastAsync<std::string>(Func2(MakeTestError()));
 
     BOOST_CHECK(!res.IsReady());
 
-    BOOST_CHECKPOINT("Waiting with timeout");
+    BOOST_TEST_CHECKPOINT("Waiting with timeout");
     res.WaitFor(100);
 
     BOOST_CHECK(!res.IsReady());
@@ -597,4 +593,4 @@ BOOST_AUTO_TEST_CASE(IgniteBroadcastRemoteError)
     BOOST_CHECK_EXCEPTION(res.GetValue(), IgniteError, IsTestError);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/concurrent_test.cpp b/modules/platforms/cpp/core-test/src/concurrent_test.cpp
index bcd7ddf..7d65f2f 100644
--- a/modules/platforms/cpp/core-test/src/concurrent_test.cpp
+++ b/modules/platforms/cpp/core-test/src/concurrent_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/concurrent.h>
@@ -323,4 +319,4 @@ BOOST_AUTO_TEST_CASE(ManualEventBasic)
     BOOST_CHECK(!triggered);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/continuous_query_test.cpp b/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
index a5136d2..81ea0cf 100644
--- a/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
+++ b/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <deque>
 
 #include <boost/test/unit_test.hpp>
@@ -767,4 +763,4 @@ BOOST_AUTO_TEST_CASE(TestFilterMultipleNodes)
     lsnr.CheckNextEvent(149, boost::none, TestEntry(1490));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/date_time_test.cpp b/modules/platforms/cpp/core-test/src/date_time_test.cpp
index 6e01309..0ba23ab 100644
--- a/modules/platforms/cpp/core-test/src/date_time_test.cpp
+++ b/modules/platforms/cpp/core-test/src/date_time_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/time.h>
diff --git a/modules/platforms/cpp/core-test/src/decimal_test.cpp b/modules/platforms/cpp/core-test/src/decimal_test.cpp
index 9d0bacf..2405249 100644
--- a/modules/platforms/cpp/core-test/src/decimal_test.cpp
+++ b/modules/platforms/cpp/core-test/src/decimal_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/bits.h>
diff --git a/modules/platforms/cpp/core-test/src/dynamic_size_array_test.cpp b/modules/platforms/cpp/core-test/src/dynamic_size_array_test.cpp
index fb9a468..b0345be 100644
--- a/modules/platforms/cpp/core-test/src/dynamic_size_array_test.cpp
+++ b/modules/platforms/cpp/core-test/src/dynamic_size_array_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/dynamic_size_array.h>
@@ -357,4 +353,4 @@ BOOST_AUTO_TEST_CASE(Swap)
     BOOST_CHECK_EQUAL(test1[1], std::string("!"));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/fixed_size_array_test.cpp b/modules/platforms/cpp/core-test/src/fixed_size_array_test.cpp
index 4574a98..f7658b1 100644
--- a/modules/platforms/cpp/core-test/src/fixed_size_array_test.cpp
+++ b/modules/platforms/cpp/core-test/src/fixed_size_array_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/fixed_size_array.h>
@@ -205,4 +201,4 @@ BOOST_AUTO_TEST_CASE(Swap)
     BOOST_CHECK_EQUAL(test1[1], std::string("!"));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/future_test.cpp b/modules/platforms/cpp/core-test/src/future_test.cpp
index 3d5c659..6f65918 100644
--- a/modules/platforms/cpp/core-test/src/future_test.cpp
+++ b/modules/platforms/cpp/core-test/src/future_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/common/promise.h>
@@ -471,4 +467,4 @@ BOOST_AUTO_TEST_CASE(FutureVoidBroken)
     BOOST_CHECK_EXCEPTION(future2.GetValue(), IgniteError, IsFutureError);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/handle_registry_test.cpp b/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
index db75e0b..e801ea4 100644
--- a/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
+++ b/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/impl/handle_registry.h"
@@ -173,4 +169,4 @@ BOOST_AUTO_TEST_CASE(TestNonCritical)
     BOOST_REQUIRE(closedProbe.deleted);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/ignite_error_test.cpp b/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
index 69ad8cf..619780c 100644
--- a/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
+++ b/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite_error.h"
@@ -42,4 +38,4 @@ BOOST_AUTO_TEST_CASE(TestIgniteErrorDerivesStdException)
     }
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/ignition_test.cpp b/modules/platforms/cpp/core-test/src/ignition_test.cpp
index 8b99936..a7fe39a 100644
--- a/modules/platforms/cpp/core-test/src/ignition_test.cpp
+++ b/modules/platforms/cpp/core-test/src/ignition_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
@@ -114,4 +110,4 @@ BOOST_AUTO_TEST_CASE(GracefulDeathOnInvalidConfig)
     Ignition::StopAll(false);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/core-test/src/interop_memory_test.cpp b/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
index cd28cf4..353028f 100644
--- a/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
+++ b/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/core-test/src/interop_test.cpp b/modules/platforms/cpp/core-test/src/interop_test.cpp
index 1b07a03..6a7ad06 100644
--- a/modules/platforms/cpp/core-test/src/interop_test.cpp
+++ b/modules/platforms/cpp/core-test/src/interop_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignition.h"
diff --git a/modules/platforms/cpp/core-test/src/reference_test.cpp b/modules/platforms/cpp/core-test/src/reference_test.cpp
index ec445c7..2963e16 100644
--- a/modules/platforms/cpp/core-test/src/reference_test.cpp
+++ b/modules/platforms/cpp/core-test/src/reference_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <memory>
 
 #include <boost/test/unit_test.hpp>
diff --git a/modules/platforms/cpp/core-test/src/teamcity_boost.cpp b/modules/platforms/cpp/core-test/src/teamcity_boost.cpp
index 5f0441c..6d15b5d 100644
--- a/modules/platforms/cpp/core-test/src/teamcity_boost.cpp
+++ b/modules/platforms/cpp/core-test/src/teamcity_boost.cpp
@@ -1,159 +1,279 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ * Copyright 2015-2017 Alex Turbov <i....@gmail.com>
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- * 
+ *
  * $Revision: 88625 $
-*/
+ */
 
 #define BOOST_TEST_MODULE IgniteCoreTest
 
-#include <sstream>
+#include "teamcity_messages.h"
 
-#include <boost/test/unit_test_suite.hpp>
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 105900
+# include <boost/test/execution_monitor.hpp>
+#else                                                       // BOOST_VERSION < 105900
+# include <boost/test/unit_test_suite_impl.hpp>
+#endif                                                      // BOOST_VERSION < 105900
 #include <boost/test/results_collector.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/unit_test_log.hpp>
-#include <boost/test/included/unit_test.hpp>
+#include <boost/test/unit_test_log_formatter.hpp>
+#include <boost/test/unit_test.hpp>
 
-#include "teamcity_messages.h"
+#include <sstream>
 
-using namespace boost::unit_test;
-using namespace std;
+namespace jetbrains { namespace teamcity { namespace {
+const std::string ASSERT_CTX = "Assertion has occurred in a following context:";
+const std::string FAILURE_CTX = "Failure has occurred in a following context:";
+const boost::unit_test::test_unit_type UNIT_TEST_CASE =
+#if BOOST_VERSION < 105900
+    boost::unit_test::tut_case
+#else                                                       // BOOST_VERSION >= 105900
+    boost::unit_test::TUT_CASE
+#endif                                                      // BOOST_VERSION >= 105900
+  ;
+
+// Formatter implementation
+std::string toString(boost::unit_test::const_string bstr)
+{
+    std::stringstream ss(std::ios_base::out);
+    ss << bstr;
+    return ss.str();
+}
 
-namespace JetBrains {
+std::string toString(const boost::execution_exception& excpt)
+{
+    std::stringstream ss(std::ios_base::out);
+    ss << excpt.what();
+    return ss.str();
+}
+}                                                           // anonymous namespace
 
-// Custom formatter for TeamCity messages
-class TeamcityBoostLogFormatter: public boost::unit_test::unit_test_log_formatter {
+/// Custom formatter for TeamCity messages
+class TeamcityBoostLogFormatter : public boost::unit_test::unit_test_log_formatter
+{
     TeamcityMessages messages;
     std::string currentDetails;
     std::string flowId;
-    
+#if BOOST_VERSION >= 105900
+    std::string currentContextDetails;
+#endif                                                      // BOOST_VERSION >= 105900
+
 public:
-    TeamcityBoostLogFormatter(const std::string &_flowId);
+    TeamcityBoostLogFormatter(const std::string& flowId);
     TeamcityBoostLogFormatter();
-    
-    void log_start(std::ostream&, boost::unit_test::counter_t test_cases_amount);
-    void log_finish(std::ostream&);
-    void log_build_info(std::ostream&);
-
-    void test_unit_start(std::ostream&, boost::unit_test::test_unit const& tu);
-    void test_unit_finish(std::ostream&,
-        boost::unit_test::test_unit const& tu,
-        unsigned long elapsed);
-    void test_unit_skipped(std::ostream&, boost::unit_test::test_unit const& tu);
-
-    void log_exception(std::ostream&,
-        boost::unit_test::log_checkpoint_data const&,
-        boost::unit_test::const_string explanation);
-
-    void log_entry_start(std::ostream&,
-        boost::unit_test::log_entry_data const&,
-        log_entry_types let);
-    void log_entry_value(std::ostream&, boost::unit_test::const_string value);
-    void log_entry_finish(std::ostream&);
+
+    virtual ~TeamcityBoostLogFormatter() {}
+
+    virtual void log_start(std::ostream&, boost::unit_test::counter_t);
+    virtual void log_finish(std::ostream&);
+    virtual void log_build_info(std::ostream&);
+
+    virtual void test_unit_start(std::ostream&, const boost::unit_test::test_unit&);
+    virtual void test_unit_finish(std::ostream&, const boost::unit_test::test_unit&, unsigned long);
+
+    virtual void log_entry_start(std::ostream&, const boost::unit_test::log_entry_data&, log_entry_types);
+    virtual void log_entry_value(std::ostream&, boost::unit_test::const_string);
+    virtual void log_entry_finish(std::ostream&);
+
+#if BOOST_VERSION < 105900
+    virtual void log_exception(std::ostream&, const boost::unit_test::log_checkpoint_data&, boost::unit_test::const_string);
+    virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&);
+#else                                                       // BOOST_VERSION >= 105900
+    virtual void log_exception_start(std::ostream&,const boost::unit_test::log_checkpoint_data&, const boost::execution_exception&);
+    virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&, boost::unit_test::const_string);
+
+    virtual void log_exception_finish(std::ostream&);
+    virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
+# if BOOST_VERSION < 106500
+    virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
+    virtual void entry_context_finish(std::ostream&);
+# else                                                      // BOOST_VERSION >= 106500
+    virtual void log_entry_context(std::ostream&, boost::unit_test::log_level, boost::unit_test::const_string);
+    virtual void entry_context_finish(std::ostream&, boost::unit_test::log_level);
+# endif                                                     // BOOST_VERSION >= 106500
+#endif                                                      // BOOST_VERSION >= 105900
 };
 
 // Fake fixture to register formatter
-struct TeamcityFormatterRegistrar {
-    TeamcityFormatterRegistrar() {
-        if (JetBrains::underTeamcity()) {
-            boost::unit_test::unit_test_log.set_formatter(new JetBrains::TeamcityBoostLogFormatter());
-            boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_successful_tests);
+struct TeamcityFormatterRegistrar
+{
+    TeamcityFormatterRegistrar()
+    {
+        if (underTeamcity())
+        {
+            boost::unit_test::unit_test_log.set_formatter(new TeamcityBoostLogFormatter());
+            boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_test_units);
         }
     }
 };
-BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
 
-// Formatter implementation
-string toString(const_string bstr) {
-    stringstream ss;
-    
-    ss << bstr;
-    
-    return ss.str();
-}
+#if BOOST_VERSION < 106500
+    BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+#else                                                       // BOOST_VERSION >= 106500
+    BOOST_TEST_GLOBAL_CONFIGURATION(TeamcityFormatterRegistrar);
+#endif                                                      // BOOST_VERSION >= 106500
 
-TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string &_flowId)
-: flowId(_flowId)
+TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string& id)
+  : flowId(id)
 {}
 
 TeamcityBoostLogFormatter::TeamcityBoostLogFormatter()
-: flowId(getFlowIdFromEnvironment())
+  : flowId(getFlowIdFromEnvironment())
 {}
 
-void TeamcityBoostLogFormatter::log_start(ostream &out, counter_t test_cases_amount)
-{}
+void TeamcityBoostLogFormatter::log_start(std::ostream& out, boost::unit_test::counter_t /*test_cases_amount*/)
+{
+    messages.setOutput(out);
+}
 
-void TeamcityBoostLogFormatter::log_finish(ostream &out)
+void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::log_build_info(ostream &out)
+void TeamcityBoostLogFormatter::log_build_info(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::test_unit_start(ostream &out, test_unit const& tu) {
-    messages.setOutput(out);
-
-    if (tu.p_type == tut_case) {
+void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+{
+    if (tu.p_type == UNIT_TEST_CASE)
         messages.testStarted(tu.p_name, flowId);
-    } else {
+    else
         messages.suiteStarted(tu.p_name, flowId);
-    }
-    
+
     currentDetails.clear();
 }
 
-void TeamcityBoostLogFormatter::test_unit_finish(ostream &out, test_unit const& tu, unsigned long elapsed) {
-    messages.setOutput(out);
-
-    test_results const& tr = results_collector.results(tu.p_id);
-    if (tu.p_type == tut_case) {
-        if(!tr.passed()) {
-            if(tr.p_skipped) {
+void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& /*out*/, const boost::unit_test::test_unit& tu, unsigned long elapsed)
+{
+    const boost::unit_test::test_results& tr = boost::unit_test::results_collector.results(tu.p_id);
+    if (tu.p_type == UNIT_TEST_CASE)
+    {
+        if (!tr.passed())
+        {
+            if (tr.p_skipped)
                 messages.testIgnored(tu.p_name, "ignored", flowId);
-            } else if (tr.p_aborted) {
+            else if (tr.p_aborted)
                 messages.testFailed(tu.p_name, "aborted", currentDetails, flowId);
-            } else {
+            else
                 messages.testFailed(tu.p_name, "failed", currentDetails, flowId);
-            }
         }
-        
+
         messages.testFinished(tu.p_name, elapsed / 1000, flowId);
-    } else {
+    }
+    else
+    {
         messages.suiteFinished(tu.p_name, flowId);
     }
 }
 
-void TeamcityBoostLogFormatter::test_unit_skipped(ostream &out, test_unit const& tu)
-{}
+void TeamcityBoostLogFormatter::log_entry_start(std::ostream& out, const boost::unit_test::log_entry_data& entry_data, log_entry_types /*let*/)
+{
+    std::stringstream ss(std::ios_base::out);
 
-void TeamcityBoostLogFormatter::log_exception(ostream &out, log_checkpoint_data const&, const_string explanation) {
-    string what = toString(explanation);
-    
-    out << what << endl;
-    currentDetails += what + "\n";
-}
+    out << entry_data.m_file_name << "(" << entry_data.m_line_num << "): ";
+    ss  << entry_data.m_file_name << "(" << entry_data.m_line_num << "): ";
 
-void TeamcityBoostLogFormatter::log_entry_start(ostream&, log_entry_data const&, log_entry_types let)
-{}
+    currentDetails += ss.str();
+}
 
-void TeamcityBoostLogFormatter::log_entry_value(ostream &out, const_string value) {
+void TeamcityBoostLogFormatter::log_entry_value(std::ostream& out, boost::unit_test::const_string value)
+{
     out << value;
     currentDetails += toString(value);
 }
 
-void TeamcityBoostLogFormatter::log_entry_finish(ostream &out) {
-    out << endl;
-    currentDetails += "\n";
+void TeamcityBoostLogFormatter::log_entry_finish(std::ostream& out)
+{
+    out << '\n';
+    currentDetails += '\n';
 }
 
+#if BOOST_VERSION < 105900
+
+void TeamcityBoostLogFormatter::log_exception(
+    std::ostream& out
+  , const boost::unit_test::log_checkpoint_data&
+  , boost::unit_test::const_string explanation
+  )
+{
+    out << explanation << '\n';
+    currentDetails += toString(explanation) + '\n';
 }
+
+void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+{
+    messages.testIgnored(tu.p_name, "test ignored", flowId);
+}
+
+#else                                                       // BOOST_VERSION >= 105900
+
+void TeamcityBoostLogFormatter::log_exception_start(
+    std::ostream& out
+  , const boost::unit_test::log_checkpoint_data&
+  , const boost::execution_exception& excpt
+  )
+{
+    const std::string what = toString(excpt);
+
+    out << what << '\n';
+    currentDetails += what + '\n';
+}
+
+void TeamcityBoostLogFormatter::test_unit_skipped(
+    std::ostream& /*out*/
+  , const boost::unit_test::test_unit& tu
+  , boost::unit_test::const_string reason
+  )
+{
+    messages.testIgnored(tu.p_name, toString(reason), flowId);
+}
+
+void TeamcityBoostLogFormatter::log_exception_finish(std::ostream& /*out*/)
+{}
+
+void TeamcityBoostLogFormatter::entry_context_start(std::ostream& out, boost::unit_test::log_level l)
+{
+    const std::string& initial_msg = (l == boost::unit_test::log_successful_tests ? ASSERT_CTX : FAILURE_CTX);
+    out << initial_msg;
+    currentContextDetails = initial_msg;
+}
+
+# if BOOST_VERSION < 106500
+void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::const_string ctx)
+# else                                                      // BOOST_VERSION >= 106500
+void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::log_level, boost::unit_test::const_string ctx)
+# endif                                                     // BOOST_VERSION >= 106500
+{
+    out << "\n " << ctx;
+    currentContextDetails += "\n " + toString(ctx);
+}
+
+# if BOOST_VERSION < 106500
+void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out)
+# else                                                      // BOOST_VERSION >= 106500
+void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out, boost::unit_test::log_level)
+# endif                                                     // BOOST_VERSION >= 106500
+{
+    out.flush();
+    messages.testOutput(
+        boost::unit_test_framework::framework::current_test_case().full_name()
+      , currentContextDetails
+      , flowId
+      , TeamcityMessages::StdErr
+      );
+}
+
+#endif                                                      // BOOST_VERSION >= 105900
+}}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/core-test/src/teamcity_messages.cpp b/modules/platforms/cpp/core-test/src/teamcity_messages.cpp
index 087409e..103e091 100644
--- a/modules/platforms/cpp/core-test/src/teamcity_messages.cpp
+++ b/modules/platforms/cpp/core-test/src/teamcity_messages.cpp
@@ -1,11 +1,11 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,136 +15,182 @@
  * $Revision: 88625 $
 */
 
-#include <stdlib.h>
-#include <sstream>
-
 #include "teamcity_messages.h"
 
-using namespace std;
+#include <cstdlib>
+#include <iostream>
+#include <sstream>
 
-namespace JetBrains {
+namespace jetbrains { namespace teamcity { namespace {
+/// Use RAII to write message open/close markers
+class RaiiMessage
+{
+public:
+    RaiiMessage(const char* const name, std::ostream& out)
+      : m_out(out)
+    {
+        // endl for http://jetbrains.net/tracker/issue/TW-4412
+        m_out << std::endl << "##teamcity[" << name;
+    }
+    ~RaiiMessage()
+    {
+        // endl for http://jetbrains.net/tracker/issue/TW-4412
+        m_out << "]" << std::endl;
+    }
+    /// \todo Copying char-by-char is ineffective!
+    std::string escape(const std::string s)
+    {
+        std::string result;
+
+        for (size_t i = 0; i < s.length(); i++)
+        {
+            char c = s[i];
+
+            switch (c)
+            {
+            case '\n': result.append("|n"); break;
+            case '\r': result.append("|r"); break;
+            case '\'': result.append("|'"); break;
+            case '|':  result.append("||"); break;
+            case ']':  result.append("|]"); break;
+            default:   result.append(&c, 1);
+            }
+        }
 
-std::string getFlowIdFromEnvironment() {
-    const char *flowId = getenv("TEAMCITY_PROCESS_FLOW_ID");
-    return flowId == NULL ? "" : flowId;
-}
+        return result;
+    }
 
-bool underTeamcity() {
-    return getenv("TEAMCITY_PROJECT_NAME") != NULL;
-}
+    void writeProperty(const char* const name, const std::string value)
+    {
+        m_out << ' ' << name << "='" << escape(value) << '\'';
+    }
 
-TeamcityMessages::TeamcityMessages()
-: m_out(&cout)
-{}
+    void writePropertyIfNonEmpty(const char* const name, const std::string value)
+    {
+        if (!value.empty())
+            writeProperty(name, value);
+    }
 
-void TeamcityMessages::setOutput(ostream &out) {
-    m_out = &out;
+private:
+    std::ostream& m_out;
+};
+}                                                           // anonymous namespace
+
+//BEGIN Public helper functions
+std::string getFlowIdFromEnvironment()
+{
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+    char* flowId = 0;
+    size_t sz = 0;
+    std::string result;
+    if (!_dupenv_s(&flowId, &sz, "TEAMCITY_PROCESS_FLOW_ID"))
+    {
+        result = flowId != 0 ? flowId : std::string();
+        free(flowId);
+    }
+
+    return result;
+#else
+    const char *flowId = getenv("TEAMCITY_PROCESS_FLOW_ID");
+    return flowId == 0 ? std::string() : flowId;
+#endif
 }
 
-string TeamcityMessages::escape(string s) {
-    string result;
-    
-    for (size_t i = 0; i < s.length(); i++) {
-        char c = s[i];
-        
-        switch (c) {
-        case '\n': result.append("|n"); break;
-        case '\r': result.append("|r"); break;
-        case '\'': result.append("|'"); break;
-        case '|':  result.append("||"); break;
-        case ']':  result.append("|]"); break;
-        default:   result.append(&c, 1);
-        }
+bool underTeamcity()
+{
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+    char* teamCityProjectName = 0;
+    size_t sz = 0;
+    bool result = false;
+    if (!_dupenv_s(&teamCityProjectName, &sz, "TEAMCITY_PROJECT_NAME"))
+    {
+        result = teamCityProjectName != 0;
+        free(teamCityProjectName);
     }
-    
+
     return result;
+#else
+    return getenv("TEAMCITY_PROJECT_NAME") != 0;
+#endif
 }
+//END Public helper functions
 
-void TeamcityMessages::openMsg(const string &name) {
-    // endl for http://jetbrains.net/tracker/issue/TW-4412
-    *m_out << endl << "##teamcity[" << name;
-}
+//BEGIN TeamcityMessages members
 
-void TeamcityMessages::closeMsg() {
-    *m_out << "]";
-    // endl for http://jetbrains.net/tracker/issue/TW-4412
-    *m_out << endl;
-    m_out->flush();
-}
+TeamcityMessages::TeamcityMessages()
+  : m_out(&std::cout)
+{}
 
-void TeamcityMessages::writeProperty(string name, string value) {
-    *m_out << " " << name << "='" << escape(value) << "'";
+void TeamcityMessages::setOutput(std::ostream& out)
+{
+    m_out = &out;
 }
 
-void TeamcityMessages::suiteStarted(string name, string flowid) {
-    openMsg("testSuiteStarted");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::suiteStarted(const std::string& name, const std::string& flowId)
+{
+    RaiiMessage msg("testSuiteStarted", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::suiteFinished(string name, string flowid) {
-    openMsg("testSuiteFinished");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::suiteFinished(const std::string& name, const std::string& flowId)
+{
+    RaiiMessage msg("testSuiteFinished", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::testStarted(string name, string flowid) {
-    openMsg("testStarted");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::testStarted(const std::string& name, const std::string& flowId, const bool captureStandardOutput)
+{
+    RaiiMessage msg("testStarted", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
+
+    if (captureStandardOutput)
+        msg.writeProperty("captureStandardOutput", "true"); // false by default
 }
 
-void TeamcityMessages::testFinished(string name, int durationMs, string flowid) {
-    openMsg("testFinished");
+void TeamcityMessages::testFinished(const std::string& name, const int durationMs, const std::string& flowId)
+{
+    RaiiMessage msg("testFinished", *m_out);
 
-    writeProperty("name", name);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-
-    if(durationMs >= 0) {
-        stringstream out;
+    if (durationMs >= 0)
+    {
+        /// \bug W/ some locales it is possible to get a number w/ a number separator(s)!
+        /// \todo Make a test for that!
+        std::stringstream out(std::ios_base::out);
         out << durationMs;
-        writeProperty("duration", out.str());
+        msg.writeProperty("duration", out.str());
     }
-    
-    closeMsg();
 }
 
-void TeamcityMessages::testFailed(string name, string message, string details, string flowid) {
-    openMsg("testFailed");
-    writeProperty("name", name);
-    writeProperty("message", message);
-    writeProperty("details", details);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::testFailed(const std::string& name, const std::string& message, const std::string& details, const std::string& flowId)
+{
+    RaiiMessage msg("testFailed", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("message", message);
+    msg.writeProperty("details", details);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::testIgnored(std::string name, std::string message, string flowid) {
-    openMsg("testIgnored");
-    writeProperty("name", name);
-    writeProperty("message", message);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::testIgnored(const std::string& name, const std::string& message, const std::string& flowId)
+{
+    RaiiMessage msg("testIgnored", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("message", message);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
+void TeamcityMessages::testOutput(const std::string& name, const std::string& output, const std::string& flowId, const bool isStdError)
+{
+    RaiiMessage msg(isStdError ? "testStdErr" : "testStdOut", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("out", output);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
+
+//END TeamcityMessages members
+}}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/core-test/src/test_utils.cpp b/modules/platforms/cpp/core-test/src/test_utils.cpp
index 749c581..b843a25 100644
--- a/modules/platforms/cpp/core-test/src/test_utils.cpp
+++ b/modules/platforms/cpp/core-test/src/test_utils.cpp
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#include <boost/test/unit_test.hpp>
+
 #include <cassert>
 
 #include "ignite/test_utils.h"
diff --git a/modules/platforms/cpp/core-test/src/transactions_test.cpp b/modules/platforms/cpp/core-test/src/transactions_test.cpp
index 9ba47cb..dd69668 100644
--- a/modules/platforms/cpp/core-test/src/transactions_test.cpp
+++ b/modules/platforms/cpp/core-test/src/transactions_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignition.h"
@@ -353,7 +349,7 @@ BOOST_AUTO_TEST_CASE(TransactionsMetricsNe)
     IgniteError err;
 
     TransactionMetrics metrics = transactions.GetMetrics(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(metrics.IsValid());
@@ -374,29 +370,29 @@ BOOST_AUTO_TEST_CASE(TransactionCommitNe)
     BOOST_REQUIRE(!tx.IsValid());
 
     tx = transactions.TxStart(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(transactions.GetTx().IsValid());
 
     cache.Put(1, 1, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     cache.Put(2, 2, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     tx.Commit(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(1, cache.Get(1, err));
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(2, cache.Get(2, err));
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     tx = transactions.GetTx();
@@ -411,11 +407,11 @@ BOOST_AUTO_TEST_CASE(TransactionRollbackNe)
     IgniteError err;
 
     cache.Put(1, 1, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     cache.Put(2, 2, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     Transactions transactions = grid.GetTransactions();
@@ -424,29 +420,29 @@ BOOST_AUTO_TEST_CASE(TransactionRollbackNe)
     BOOST_REQUIRE(!tx.IsValid());
 
     tx = transactions.TxStart(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(transactions.GetTx().IsValid());
 
     cache.Put(1, 10, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     cache.Put(2, 20, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     tx.Rollback(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(1, cache.Get(1, err));
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(2, cache.Get(2, err));
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     tx = transactions.GetTx();
@@ -461,11 +457,11 @@ BOOST_AUTO_TEST_CASE(TransactionCloseNe)
     IgniteError err;
 
     cache.Put(1, 1, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     cache.Put(2, 2, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     Transactions transactions = grid.GetTransactions();
@@ -474,29 +470,29 @@ BOOST_AUTO_TEST_CASE(TransactionCloseNe)
     BOOST_REQUIRE(!tx.IsValid());
 
     tx = transactions.TxStart(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(transactions.GetTx().IsValid());
 
     cache.Put(1, 10, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     cache.Put(2, 20, err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     tx.Close(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(1, cache.Get(1, err));
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(2, cache.Get(2, err));
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     tx = transactions.GetTx();
@@ -523,7 +519,7 @@ BOOST_AUTO_TEST_CASE(TransactionRollbackOnlyNe)
     BOOST_CHECK(!tx.IsRollbackOnly());
 
     tx.SetRollbackOnly(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK(tx.IsRollbackOnly());
@@ -532,7 +528,7 @@ BOOST_AUTO_TEST_CASE(TransactionRollbackOnlyNe)
     BOOST_REQUIRE(err.GetCode() != IgniteError::IGNITE_SUCCESS);
 
     tx.Close(err);
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_CHECK_EQUAL(TransactionState::ROLLED_BACK, tx.GetState());
@@ -560,7 +556,7 @@ BOOST_AUTO_TEST_CASE(TransactionAttributesNe)
     tx = transactions.TxStart(TransactionConcurrency::OPTIMISTIC,
         TransactionIsolation::SERIALIZABLE, 1000, 100, err);
 
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(transactions.GetTx().IsValid());
@@ -581,7 +577,7 @@ BOOST_AUTO_TEST_CASE(TransactionAttributesNe)
     tx = transactions.TxStart(TransactionConcurrency::PESSIMISTIC,
         TransactionIsolation::READ_COMMITTED, 2000, 10, err);
 
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(transactions.GetTx().IsValid());
@@ -602,7 +598,7 @@ BOOST_AUTO_TEST_CASE(TransactionAttributesNe)
     tx = transactions.TxStart(TransactionConcurrency::OPTIMISTIC,
         TransactionIsolation::REPEATABLE_READ, 3000, 0, err);
 
-    if (!err.GetCode() == IgniteError::IGNITE_SUCCESS)
+    if (err.GetCode() != IgniteError::IGNITE_SUCCESS)
         BOOST_ERROR(err.GetText());
 
     BOOST_REQUIRE(transactions.GetTx().IsValid());
diff --git a/modules/platforms/cpp/odbc-test/Makefile.am b/modules/platforms/cpp/odbc-test/Makefile.am
index c5dc54e..58f72a8 100644
--- a/modules/platforms/cpp/odbc-test/Makefile.am
+++ b/modules/platforms/cpp/odbc-test/Makefile.am
@@ -36,7 +36,8 @@ AM_CPPFLAGS = \
     -I$(JAVA_HOME)/include/linux \
     -DIGNITE_IMPL \
     -D__STDC_LIMIT_MACROS \
-    -D__STDC_CONSTANT_MACROS
+    -D__STDC_CONSTANT_MACROS \
+    -DBOOST_TEST_DYN_LINK
 
 AM_CXXFLAGS = \
     -Wall \
@@ -49,7 +50,8 @@ ignite_odbc_tests_LDADD = \
     -lpthread \
     -lboost_thread \
     -lboost_system \
-    -lboost_chrono
+    -lboost_chrono \
+    -lboost_unit_test_framework
 
 ignite_odbc_tests_LDFLAGS = \
     -static-libtool-libs
diff --git a/modules/platforms/cpp/odbc-test/include/sql_test_suite_fixture.h b/modules/platforms/cpp/odbc-test/include/sql_test_suite_fixture.h
index b6af53d..c0de8a1 100644
--- a/modules/platforms/cpp/odbc-test/include/sql_test_suite_fixture.h
+++ b/modules/platforms/cpp/odbc-test/include/sql_test_suite_fixture.h
@@ -27,10 +27,6 @@
 
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/include/teamcity/teamcity_messages.h b/modules/platforms/cpp/odbc-test/include/teamcity/teamcity_messages.h
index 81a915b..98f259d 100644
--- a/modules/platforms/cpp/odbc-test/include/teamcity/teamcity_messages.h
+++ b/modules/platforms/cpp/odbc-test/include/teamcity/teamcity_messages.h
@@ -21,35 +21,35 @@
 #include <string>
 #include <iostream>
 
-namespace JetBrains {
+namespace jetbrains { namespace teamcity {
 
 std::string getFlowIdFromEnvironment();
 bool underTeamcity();
 
-class TeamcityMessages {
-    std::ostream *m_out;
-
-protected:
-    std::string escape(std::string s);
-
-    void openMsg(const std::string &name);
-    void writeProperty(std::string name, std::string value);
-    void closeMsg();
+class TeamcityMessages
+{
+    std::ostream* m_out;
 
 public:
+    static const bool StdErr = true;
+    static const bool StdOut = false;
+
     TeamcityMessages();
 
-    void setOutput(std::ostream &);
+    void setOutput(std::ostream&);
+
+    void suiteStarted(const std::string& name, const std::string& flowid = std::string());
+    void suiteFinished(const std::string& name, const std::string& flowid = std::string());
+
+    void testStarted(const std::string& name, const std::string& flowid = std::string(), bool captureStandardOutput = false);
+    void testFinished(const std::string& name, int durationMs = -1, const std::string& flowid = std::string());
 
-    void suiteStarted(std::string name, std::string flowid = "");
-    void suiteFinished(std::string name, std::string flowid = "");
+    void testFailed(const std::string& name, const std::string& message, const std::string& details, const std::string& flowid = std::string());
+    void testIgnored(const std::string& name, const std::string& message, const std::string& flowid = std::string());
 
-    void testStarted(std::string name, std::string flowid = "");
-    void testFailed(std::string name, std::string message, std::string details, std::string flowid = "");
-    void testIgnored(std::string name, std::string message, std::string flowid = "");
-    void testFinished(std::string name, int durationMs = -1, std::string flowid = "");    
+    void testOutput(const std::string& name, const std::string& output, const std::string& flowid, bool isStdErr = StdOut);
 };
 
-}
+}} // namespace teamcity, jetbrains
 
 #endif /* H_TEAMCITY_MESSAGES */
diff --git a/modules/platforms/cpp/odbc-test/include/test_utils.h b/modules/platforms/cpp/odbc-test/include/test_utils.h
index 58a4347..1f2aeec 100644
--- a/modules/platforms/cpp/odbc-test/include/test_utils.h
+++ b/modules/platforms/cpp/odbc-test/include/test_utils.h
@@ -49,6 +49,14 @@
         BOOST_FAIL(ignite_test::GetOdbcErrorMessage(type, handle) + ", msg = " + msg); \
     }
 
+#define MUTE_TEST_FOR_TEAMCITY \
+    if (jetbrains::teamcity::underTeamcity()) \
+    { \
+        BOOST_TEST_MESSAGE("Muted on TeamCity because of periodical non-critical failures"); \
+        BOOST_CHECK(jetbrains::teamcity::underTeamcity()); \
+        return; \
+    }
+
 /**
  * Client ODBC erorr.
  */
diff --git a/modules/platforms/cpp/odbc-test/project/vs/odbc-test.vcxproj b/modules/platforms/cpp/odbc-test/project/vs/odbc-test.vcxproj
index 0147e8a..602f449 100644
--- a/modules/platforms/cpp/odbc-test/project/vs/odbc-test.vcxproj
+++ b/modules/platforms/cpp/odbc-test/project/vs/odbc-test.vcxproj
@@ -98,7 +98,8 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_unit_test_framework-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_thread-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_system-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_chrono-vc100-mt-gd-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_LIB32_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_system-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_D32).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -112,7 +113,7 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_unit_test_framework-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_thread-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_system-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_chrono-vc100-mt-gd-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_LIB64_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_system-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_D64).lib;%(AdditionalDependencies)</AdditionalDependencies>
       <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
@@ -131,7 +132,8 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_unit_test_framework-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_thread-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_system-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_chrono-vc100-mt-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_LIB32_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_system-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_R32).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -149,7 +151,8 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_unit_test_framework-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_thread-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_system-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_chrono-vc100-mt-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;$(BOOST_LIB64_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_system-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_R64).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
diff --git a/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp b/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp
index 4259667..963b67f 100644
--- a/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp
@@ -27,10 +27,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp b/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp
index 7329bcb..4f32dcd 100644
--- a/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <ignite/odbc/system/odbc_constants.h>
 
 #include <boost/test/unit_test.hpp>
diff --git a/modules/platforms/cpp/odbc-test/src/attributes_test.cpp b/modules/platforms/cpp/odbc-test/src/attributes_test.cpp
index 69bca67..73127f4 100644
--- a/modules/platforms/cpp/odbc-test/src/attributes_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/attributes_test.cpp
@@ -25,10 +25,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/authentication_test.cpp b/modules/platforms/cpp/odbc-test/src/authentication_test.cpp
index b93def6..5a77370 100644
--- a/modules/platforms/cpp/odbc-test/src/authentication_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/authentication_test.cpp
@@ -20,10 +20,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/regex.hpp>
 #include <boost/test/unit_test.hpp>
 
diff --git a/modules/platforms/cpp/odbc-test/src/column_test.cpp b/modules/platforms/cpp/odbc-test/src/column_test.cpp
index 215f043..0334256 100644
--- a/modules/platforms/cpp/odbc-test/src/column_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/column_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/impl/binary/binary_common.h>
diff --git a/modules/platforms/cpp/odbc-test/src/configuration_test.cpp b/modules/platforms/cpp/odbc-test/src/configuration_test.cpp
index 4cfc940..b6f793d 100644
--- a/modules/platforms/cpp/odbc-test/src/configuration_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/configuration_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <iostream>
 #include <set>
 
diff --git a/modules/platforms/cpp/odbc-test/src/connection_info_test.cpp b/modules/platforms/cpp/odbc-test/src/connection_info_test.cpp
index 2119c09..589ed9b 100644
--- a/modules/platforms/cpp/odbc-test/src/connection_info_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/connection_info_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <iostream>
 
 #include <boost/test/unit_test.hpp>
@@ -217,4 +213,4 @@ BOOST_AUTO_TEST_CASE(TestConnectionInfoSupportedInfo)
 #endif //SQL_QUOTED_IDENTIFIER_CASE
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/odbc-test/src/connection_test.cpp b/modules/platforms/cpp/odbc-test/src/connection_test.cpp
index e9d0fb2..ee54ed2 100644
--- a/modules/platforms/cpp/odbc-test/src/connection_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/connection_test.cpp
@@ -24,10 +24,6 @@
 
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/cursor_test.cpp b/modules/platforms/cpp/odbc-test/src/cursor_test.cpp
index add1e2e..b761b63 100644
--- a/modules/platforms/cpp/odbc-test/src/cursor_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/cursor_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/impl/binary/binary_writer_impl.h>
@@ -202,4 +198,4 @@ BOOST_AUTO_TEST_CASE(TestCursorUpdateOneRow)
     BOOST_REQUIRE(!cursor.Increment());
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/odbc-test/src/errors_test.cpp b/modules/platforms/cpp/odbc-test/src/errors_test.cpp
index 7d330b9..0ce7eac 100644
--- a/modules/platforms/cpp/odbc-test/src/errors_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/errors_test.cpp
@@ -26,10 +26,6 @@
 #include <string>
 #include <algorithm>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/regex.hpp>
 #include <boost/test/unit_test.hpp>
 
diff --git a/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp b/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
index 1edda7c..bd6b31a 100644
--- a/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/meta_queries_test.cpp
@@ -26,10 +26,6 @@
 #include <string>
 #include <algorithm>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignition.h"
diff --git a/modules/platforms/cpp/odbc-test/src/odbc_test_suite.cpp b/modules/platforms/cpp/odbc-test/src/odbc_test_suite.cpp
index b79d13a..39f599b 100644
--- a/modules/platforms/cpp/odbc-test/src/odbc_test_suite.cpp
+++ b/modules/platforms/cpp/odbc-test/src/odbc_test_suite.cpp
@@ -22,10 +22,6 @@
 #include <sql.h>
 #include <sqlext.h>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignition.h"
@@ -332,7 +328,7 @@ namespace ignite
             FixedSizeArray<SQLLEN> strFieldsLen(recordsNum);
             FixedSizeArray<SQLLEN> i8ArrayFieldsLen(recordsNum);
 
-            BOOST_CHECKPOINT("Filling param data");
+            BOOST_TEST_CHECKPOINT("Filling param data");
 
             for (int i = 0; i < recordsNum; ++i)
             {
@@ -374,91 +370,91 @@ namespace ignite
 
             SQLULEN setsProcessed = 0;
 
-            BOOST_CHECKPOINT("Setting processed pointer");
+            BOOST_TEST_CHECKPOINT("Setting processed pointer");
             ret = SQLSetStmtAttr(stmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &setsProcessed, SQL_IS_POINTER);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding keys");
+            BOOST_TEST_CHECKPOINT("Binding keys");
             ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SBIGINT, SQL_BIGINT, 0, 0, keys.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding i8Fields");
+            BOOST_TEST_CHECKPOINT("Binding i8Fields");
             ret = SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_STINYINT, SQL_TINYINT, 0, 0, i8Fields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding i16Fields");
+            BOOST_TEST_CHECKPOINT("Binding i16Fields");
             ret = SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_SMALLINT, 0, 0, i16Fields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding i32Fields");
+            BOOST_TEST_CHECKPOINT("Binding i32Fields");
             ret = SQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, i32Fields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding strFields");
+            BOOST_TEST_CHECKPOINT("Binding strFields");
             ret = SQLBindParameter(stmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 1024, 0, strFields.GetData(), 1024, strFieldsLen.GetData());
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding floatFields");
+            BOOST_TEST_CHECKPOINT("Binding floatFields");
             ret = SQLBindParameter(stmt, 6, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, floatFields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding doubleFields");
+            BOOST_TEST_CHECKPOINT("Binding doubleFields");
             ret = SQLBindParameter(stmt, 7, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, doubleFields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding boolFields");
+            BOOST_TEST_CHECKPOINT("Binding boolFields");
             ret = SQLBindParameter(stmt, 8, SQL_PARAM_INPUT, SQL_C_BIT, SQL_BIT, 0, 0, boolFields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding dateFields");
+            BOOST_TEST_CHECKPOINT("Binding dateFields");
             ret = SQLBindParameter(stmt, 9, SQL_PARAM_INPUT, SQL_C_DATE, SQL_DATE, 0, 0, dateFields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding timeFields");
+            BOOST_TEST_CHECKPOINT("Binding timeFields");
             ret = SQLBindParameter(stmt, 10, SQL_PARAM_INPUT, SQL_C_TIME, SQL_TIME, 0, 0, timeFields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding timestampFields");
+            BOOST_TEST_CHECKPOINT("Binding timestampFields");
             ret = SQLBindParameter(stmt, 11, SQL_PARAM_INPUT, SQL_C_TIMESTAMP, SQL_TIMESTAMP, 0, 0, timestampFields.GetData(), 0, 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Binding i8ArrayFields");
+            BOOST_TEST_CHECKPOINT("Binding i8ArrayFields");
             ret = SQLBindParameter(stmt, 12, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, 42, 0, i8ArrayFields.GetData(), 42, i8ArrayFieldsLen.GetData());
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Setting paramset size");
+            BOOST_TEST_CHECKPOINT("Setting paramset size");
             ret = SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, reinterpret_cast<SQLPOINTER>(recordsNum), 0);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Executing query");
+            BOOST_TEST_CHECKPOINT("Executing query");
             ret = SQLExecute(stmt);
 
             if (!SQL_SUCCEEDED(ret))
@@ -476,7 +472,7 @@ namespace ignite
 
                 totallyAffected += affected;
 
-                BOOST_CHECKPOINT("Getting next result set");
+                BOOST_TEST_CHECKPOINT("Getting next result set");
 
                 ret = SQLMoreResults(stmt);
 
@@ -487,13 +483,13 @@ namespace ignite
 
             BOOST_CHECK_EQUAL(totallyAffected, expectedToAffect);
 
-            BOOST_CHECKPOINT("Resetting parameters.");
+            BOOST_TEST_CHECKPOINT("Resetting parameters.");
             ret = SQLFreeStmt(stmt, SQL_RESET_PARAMS);
 
             if (!SQL_SUCCEEDED(ret))
                 BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
 
-            BOOST_CHECKPOINT("Setting paramset size");
+            BOOST_TEST_CHECKPOINT("Setting paramset size");
             ret = SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, reinterpret_cast<SQLPOINTER>(1), 0);
 
             if (!SQL_SUCCEEDED(ret))
diff --git a/modules/platforms/cpp/odbc-test/src/parser_test.cpp b/modules/platforms/cpp/odbc-test/src/parser_test.cpp
index af11369..f2d1e80 100644
--- a/modules/platforms/cpp/odbc-test/src/parser_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/parser_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/odbc/parser.h>
@@ -84,4 +80,4 @@ BOOST_AUTO_TEST_CASE(TestParserEncodeDecode)
     BOOST_REQUIRE(outMsg == inMsg);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/odbc-test/src/queries_ssl_test.cpp b/modules/platforms/cpp/odbc-test/src/queries_ssl_test.cpp
index 3ff2f56..d66911a 100644
--- a/modules/platforms/cpp/odbc-test/src/queries_ssl_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/queries_ssl_test.cpp
@@ -21,10 +21,6 @@
 #include <string>
 #include <sstream>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/regex.hpp>
 #include <boost/test/unit_test.hpp>
 
diff --git a/modules/platforms/cpp/odbc-test/src/queries_test.cpp b/modules/platforms/cpp/odbc-test/src/queries_test.cpp
index cfc3fad..ac71676 100644
--- a/modules/platforms/cpp/odbc-test/src/queries_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/queries_test.cpp
@@ -26,10 +26,6 @@
 #include <string>
 #include <algorithm>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
@@ -803,8 +799,7 @@ BOOST_AUTO_TEST_CASE(TestNullFields)
 
 BOOST_AUTO_TEST_CASE(TestDistributedJoins)
 {
-    if (JetBrains::underTeamcity())
-        return;
+    MUTE_TEST_FOR_TEAMCITY;
 
     // Starting additional node.
     Ignite node1 = StartAdditionalNode("Node1");
@@ -1702,7 +1697,7 @@ BOOST_AUTO_TEST_CASE(TestMultipleSelects)
 
     long res = 0;
 
-    BOOST_CHECKPOINT("Binding column");
+    BOOST_TEST_CHECKPOINT("Binding column");
     ret = SQLBindCol(stmt, 1, SQL_C_SLONG, &res, 0, 0);
 
     if (!SQL_SUCCEEDED(ret))
@@ -1752,7 +1747,7 @@ BOOST_AUTO_TEST_CASE(TestMultipleMixedStatements)
 
     long res = 0;
 
-    BOOST_CHECKPOINT("Binding column");
+    BOOST_TEST_CHECKPOINT("Binding column");
     ret = SQLBindCol(stmt, 1, SQL_C_SLONG, &res, 0, 0);
 
     if (!SQL_SUCCEEDED(ret))
@@ -1819,7 +1814,7 @@ BOOST_AUTO_TEST_CASE(TestMultipleMixedStatementsNoFetch)
 
     long res = 0;
 
-    BOOST_CHECKPOINT("Binding column");
+    BOOST_TEST_CHECKPOINT("Binding column");
     ret = SQLBindCol(stmt, 1, SQL_C_SLONG, &res, 0, 0);
 
     if (!SQL_SUCCEEDED(ret))
diff --git a/modules/platforms/cpp/odbc-test/src/row_test.cpp b/modules/platforms/cpp/odbc-test/src/row_test.cpp
index 2fdd784..e5235f5 100644
--- a/modules/platforms/cpp/odbc-test/src/row_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/row_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/impl/binary/binary_writer_impl.h>
diff --git a/modules/platforms/cpp/odbc-test/src/sql_aggregate_functions_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_aggregate_functions_test.cpp
index c5bc932..348ec8d 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_aggregate_functions_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_aggregate_functions_test.cpp
@@ -29,10 +29,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_date_time_functions_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_date_time_functions_test.cpp
index d56b897..125d645 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_date_time_functions_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_date_time_functions_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "sql_test_suite_fixture.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_esc_convert_function_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_esc_convert_function_test.cpp
index a71d924..a8af9f5 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_esc_convert_function_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_esc_convert_function_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 #include "ignite/common/decimal.h"
 #include "ignite/common/utils.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_get_info_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_get_info_test.cpp
index 96e6164..351e8ae 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_get_info_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_get_info_test.cpp
@@ -24,10 +24,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignition.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_numeric_functions_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_numeric_functions_test.cpp
index 97e203b..180ff5f 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_numeric_functions_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_numeric_functions_test.cpp
@@ -29,10 +29,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_operators_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_operators_test.cpp
index d47f0fb..2325461 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_operators_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_operators_test.cpp
@@ -22,10 +22,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "test_type.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_outer_join_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_outer_join_test.cpp
index 21fc568..b71cb1d 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_outer_join_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_outer_join_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "sql_test_suite_fixture.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_parsing_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_parsing_test.cpp
index ac2e24d..da99455 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_parsing_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_parsing_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <string>
diff --git a/modules/platforms/cpp/odbc-test/src/sql_string_functions_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_string_functions_test.cpp
index 5a932f1..245c1be 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_string_functions_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_string_functions_test.cpp
@@ -25,10 +25,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_system_functions_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_system_functions_test.cpp
index 2496bc7..947330f 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_system_functions_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_system_functions_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "sql_test_suite_fixture.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_types_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_types_test.cpp
index 6ec6250..ce30f7b 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_types_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_types_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "sql_test_suite_fixture.h"
diff --git a/modules/platforms/cpp/odbc-test/src/sql_value_expressions_test.cpp b/modules/platforms/cpp/odbc-test/src/sql_value_expressions_test.cpp
index 32d49d3..be1ceda 100644
--- a/modules/platforms/cpp/odbc-test/src/sql_value_expressions_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/sql_value_expressions_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "sql_test_suite_fixture.h"
diff --git a/modules/platforms/cpp/odbc-test/src/streaming_test.cpp b/modules/platforms/cpp/odbc-test/src/streaming_test.cpp
index 6a709ba..d09b94f 100644
--- a/modules/platforms/cpp/odbc-test/src/streaming_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/streaming_test.cpp
@@ -25,10 +25,6 @@
 #include <vector>
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
@@ -39,7 +35,6 @@
 #include "test_utils.h"
 #include "odbc_test_suite.h"
 #include "ignite/odbc/socket_client.h"
-#include <boost/thread/v2/thread.hpp>
 
 using namespace ignite;
 using namespace ignite::common;
@@ -47,8 +42,6 @@ using namespace ignite_test;
 
 using namespace boost::unit_test;
 
-using ignite::impl::binary::BinaryUtils;
-
 /**
  * Test setup fixture.
  */
diff --git a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp
index 383ada0..4c27ac3 100644
--- a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp
+++ b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_boost.cpp
@@ -1,159 +1,279 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ * Copyright 2015-2017 Alex Turbov <i....@gmail.com>
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- * 
+ *
  * $Revision: 88625 $
-*/
+ */
 
 #define BOOST_TEST_MODULE IgniteOdbcTest
 
-#include <sstream>
+#include "teamcity/teamcity_messages.h"
 
-#include <boost/test/unit_test_suite.hpp>
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 105900
+# include <boost/test/execution_monitor.hpp>
+#else                                                       // BOOST_VERSION < 105900
+# include <boost/test/unit_test_suite_impl.hpp>
+#endif                                                      // BOOST_VERSION < 105900
 #include <boost/test/results_collector.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/unit_test_log.hpp>
-#include <boost/test/included/unit_test.hpp>
+#include <boost/test/unit_test_log_formatter.hpp>
+#include <boost/test/unit_test.hpp>
 
-#include "teamcity/teamcity_messages.h"
+#include <sstream>
+
+namespace jetbrains { namespace teamcity { namespace {
+const std::string ASSERT_CTX = "Assertion has occurred in a following context:";
+const std::string FAILURE_CTX = "Failure has occurred in a following context:";
+const boost::unit_test::test_unit_type UNIT_TEST_CASE =
+#if BOOST_VERSION < 105900
+    boost::unit_test::tut_case
+#else                                                       // BOOST_VERSION >= 105900
+    boost::unit_test::TUT_CASE
+#endif                                                      // BOOST_VERSION >= 105900
+  ;
 
-using namespace boost::unit_test;
-using namespace std;
+// Formatter implementation
+std::string toString(boost::unit_test::const_string bstr)
+{
+    std::stringstream ss(std::ios_base::out);
+    ss << bstr;
+    return ss.str();
+}
 
-namespace JetBrains {
+std::string toString(const boost::execution_exception& excpt)
+{
+    std::stringstream ss(std::ios_base::out);
+    ss << excpt.what();
+    return ss.str();
+}
+}                                                           // anonymous namespace
 
-// Custom formatter for TeamCity messages
-class TeamcityBoostLogFormatter: public boost::unit_test::unit_test_log_formatter {
+/// Custom formatter for TeamCity messages
+class TeamcityBoostLogFormatter : public boost::unit_test::unit_test_log_formatter
+{
     TeamcityMessages messages;
     std::string currentDetails;
     std::string flowId;
-    
+#if BOOST_VERSION >= 105900
+    std::string currentContextDetails;
+#endif                                                      // BOOST_VERSION >= 105900
+
 public:
-    TeamcityBoostLogFormatter(const std::string &_flowId);
+    TeamcityBoostLogFormatter(const std::string& flowId);
     TeamcityBoostLogFormatter();
 
-    void log_start(std::ostream&, boost::unit_test::counter_t test_cases_amount);
-    void log_finish(std::ostream&);
-    void log_build_info(std::ostream&);
-
-    void test_unit_start(std::ostream&, boost::unit_test::test_unit const& tu);
-    void test_unit_finish(std::ostream&,
-        boost::unit_test::test_unit const& tu,
-        unsigned long elapsed);
-    void test_unit_skipped(std::ostream&, boost::unit_test::test_unit const& tu);
-
-    void log_exception(std::ostream&,
-        boost::unit_test::log_checkpoint_data const&,
-        boost::unit_test::const_string explanation);
-
-    void log_entry_start(std::ostream&,
-        boost::unit_test::log_entry_data const&,
-        log_entry_types let);
-    void log_entry_value(std::ostream&, boost::unit_test::const_string value);
-    void log_entry_finish(std::ostream&);
+    virtual ~TeamcityBoostLogFormatter() {}
+
+    virtual void log_start(std::ostream&, boost::unit_test::counter_t);
+    virtual void log_finish(std::ostream&);
+    virtual void log_build_info(std::ostream&);
+
+    virtual void test_unit_start(std::ostream&, const boost::unit_test::test_unit&);
+    virtual void test_unit_finish(std::ostream&, const boost::unit_test::test_unit&, unsigned long);
+
+    virtual void log_entry_start(std::ostream&, const boost::unit_test::log_entry_data&, log_entry_types);
+    virtual void log_entry_value(std::ostream&, boost::unit_test::const_string);
+    virtual void log_entry_finish(std::ostream&);
+
+#if BOOST_VERSION < 105900
+    virtual void log_exception(std::ostream&, const boost::unit_test::log_checkpoint_data&, boost::unit_test::const_string);
+    virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&);
+#else                                                       // BOOST_VERSION >= 105900
+    virtual void log_exception_start(std::ostream&,const boost::unit_test::log_checkpoint_data&, const boost::execution_exception&);
+    virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&, boost::unit_test::const_string);
+
+    virtual void log_exception_finish(std::ostream&);
+    virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
+# if BOOST_VERSION < 106500
+    virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
+    virtual void entry_context_finish(std::ostream&);
+# else                                                      // BOOST_VERSION >= 106500
+    virtual void log_entry_context(std::ostream&, boost::unit_test::log_level, boost::unit_test::const_string);
+    virtual void entry_context_finish(std::ostream&, boost::unit_test::log_level);
+# endif                                                     // BOOST_VERSION >= 106500
+#endif                                                      // BOOST_VERSION >= 105900
 };
 
 // Fake fixture to register formatter
-struct TeamcityFormatterRegistrar {
-    TeamcityFormatterRegistrar() {
-        if (JetBrains::underTeamcity()) {
-            boost::unit_test::unit_test_log.set_formatter(new JetBrains::TeamcityBoostLogFormatter());
-            boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_successful_tests);
+struct TeamcityFormatterRegistrar
+{
+    TeamcityFormatterRegistrar()
+    {
+        if (underTeamcity())
+        {
+            boost::unit_test::unit_test_log.set_formatter(new TeamcityBoostLogFormatter());
+            boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_test_units);
         }
     }
 };
-BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
 
-// Formatter implementation
-string toString(const_string bstr) {
-    stringstream ss;
-
-    ss << bstr;
-
-    return ss.str();
-}
+#if BOOST_VERSION < 106500
+    BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+#else                                                       // BOOST_VERSION >= 106500
+    BOOST_TEST_GLOBAL_CONFIGURATION(TeamcityFormatterRegistrar);
+#endif                                                      // BOOST_VERSION >= 106500
 
-TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string &_flowId)
-: flowId(_flowId)
+TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string& id)
+  : flowId(id)
 {}
 
 TeamcityBoostLogFormatter::TeamcityBoostLogFormatter()
-: flowId(getFlowIdFromEnvironment())
+  : flowId(getFlowIdFromEnvironment())
 {}
 
-void TeamcityBoostLogFormatter::log_start(ostream &out, counter_t test_cases_amount)
-{}
+void TeamcityBoostLogFormatter::log_start(std::ostream& out, boost::unit_test::counter_t /*test_cases_amount*/)
+{
+    messages.setOutput(out);
+}
 
-void TeamcityBoostLogFormatter::log_finish(ostream &out)
+void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::log_build_info(ostream &out)
+void TeamcityBoostLogFormatter::log_build_info(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::test_unit_start(ostream &out, test_unit const& tu) {
-    messages.setOutput(out);
-
-    if (tu.p_type == tut_case) {
+void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+{
+    if (tu.p_type == UNIT_TEST_CASE)
         messages.testStarted(tu.p_name, flowId);
-    } else {
+    else
         messages.suiteStarted(tu.p_name, flowId);
-    }
 
     currentDetails.clear();
 }
 
-void TeamcityBoostLogFormatter::test_unit_finish(ostream &out, test_unit const& tu, unsigned long elapsed) {
-    messages.setOutput(out);
-
-    test_results const& tr = results_collector.results(tu.p_id);
-    if (tu.p_type == tut_case) {
-        if(!tr.passed()) {
-            if(tr.p_skipped) {
+void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& /*out*/, const boost::unit_test::test_unit& tu, unsigned long elapsed)
+{
+    const boost::unit_test::test_results& tr = boost::unit_test::results_collector.results(tu.p_id);
+    if (tu.p_type == UNIT_TEST_CASE)
+    {
+        if (!tr.passed())
+        {
+            if (tr.p_skipped)
                 messages.testIgnored(tu.p_name, "ignored", flowId);
-            } else if (tr.p_aborted) {
+            else if (tr.p_aborted)
                 messages.testFailed(tu.p_name, "aborted", currentDetails, flowId);
-            } else {
+            else
                 messages.testFailed(tu.p_name, "failed", currentDetails, flowId);
-            }
         }
 
         messages.testFinished(tu.p_name, elapsed / 1000, flowId);
-    } else {
+    }
+    else
+    {
         messages.suiteFinished(tu.p_name, flowId);
     }
 }
 
-void TeamcityBoostLogFormatter::test_unit_skipped(ostream &out, test_unit const& tu)
-{}
+void TeamcityBoostLogFormatter::log_entry_start(std::ostream& out, const boost::unit_test::log_entry_data& entry_data, log_entry_types /*let*/)
+{
+    std::stringstream ss(std::ios_base::out);
 
-void TeamcityBoostLogFormatter::log_exception(ostream &out, log_checkpoint_data const&, const_string explanation) {
-    string what = toString(explanation);
+    out << entry_data.m_file_name << "(" << entry_data.m_line_num << "): ";
+    ss  << entry_data.m_file_name << "(" << entry_data.m_line_num << "): ";
 
-    out << what << endl;
-    currentDetails += what + "\n";
+    currentDetails += ss.str();
 }
 
-void TeamcityBoostLogFormatter::log_entry_start(ostream&, log_entry_data const&, log_entry_types let)
-{}
-
-void TeamcityBoostLogFormatter::log_entry_value(ostream &out, const_string value) {
+void TeamcityBoostLogFormatter::log_entry_value(std::ostream& out, boost::unit_test::const_string value)
+{
     out << value;
     currentDetails += toString(value);
 }
 
-void TeamcityBoostLogFormatter::log_entry_finish(ostream &out) {
-    out << endl;
-    currentDetails += "\n";
+void TeamcityBoostLogFormatter::log_entry_finish(std::ostream& out)
+{
+    out << '\n';
+    currentDetails += '\n';
+}
+
+#if BOOST_VERSION < 105900
+
+void TeamcityBoostLogFormatter::log_exception(
+    std::ostream& out
+  , const boost::unit_test::log_checkpoint_data&
+  , boost::unit_test::const_string explanation
+  )
+{
+    out << explanation << '\n';
+    currentDetails += toString(explanation) + '\n';
+}
+
+void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+{
+    messages.testIgnored(tu.p_name, "test ignored", flowId);
+}
+
+#else                                                       // BOOST_VERSION >= 105900
+
+void TeamcityBoostLogFormatter::log_exception_start(
+    std::ostream& out
+  , const boost::unit_test::log_checkpoint_data&
+  , const boost::execution_exception& excpt
+  )
+{
+    const std::string what = toString(excpt);
+
+    out << what << '\n';
+    currentDetails += what + '\n';
+}
+
+void TeamcityBoostLogFormatter::test_unit_skipped(
+    std::ostream& /*out*/
+  , const boost::unit_test::test_unit& tu
+  , boost::unit_test::const_string reason
+  )
+{
+    messages.testIgnored(tu.p_name, toString(reason), flowId);
+}
+
+void TeamcityBoostLogFormatter::log_exception_finish(std::ostream& /*out*/)
+{}
+
+void TeamcityBoostLogFormatter::entry_context_start(std::ostream& out, boost::unit_test::log_level l)
+{
+    const std::string& initial_msg = (l == boost::unit_test::log_successful_tests ? ASSERT_CTX : FAILURE_CTX);
+    out << initial_msg;
+    currentContextDetails = initial_msg;
+}
+
+# if BOOST_VERSION < 106500
+void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::const_string ctx)
+# else                                                      // BOOST_VERSION >= 106500
+void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::log_level, boost::unit_test::const_string ctx)
+# endif                                                     // BOOST_VERSION >= 106500
+{
+    out << "\n " << ctx;
+    currentContextDetails += "\n " + toString(ctx);
 }
 
+# if BOOST_VERSION < 106500
+void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out)
+# else                                                      // BOOST_VERSION >= 106500
+void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out, boost::unit_test::log_level)
+# endif                                                     // BOOST_VERSION >= 106500
+{
+    out.flush();
+    messages.testOutput(
+        boost::unit_test_framework::framework::current_test_case().full_name()
+      , currentContextDetails
+      , flowId
+      , TeamcityMessages::StdErr
+      );
 }
+
+#endif                                                      // BOOST_VERSION >= 105900
+}}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp
index 1f224af..068b1d6 100644
--- a/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp
+++ b/modules/platforms/cpp/odbc-test/src/teamcity/teamcity_messages.cpp
@@ -1,11 +1,11 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,136 +15,182 @@
  * $Revision: 88625 $
 */
 
-#include <stdlib.h>
-#include <sstream>
-
 #include "teamcity/teamcity_messages.h"
 
-using namespace std;
-
-namespace JetBrains {
+#include <cstdlib>
+#include <iostream>
+#include <sstream>
 
-std::string getFlowIdFromEnvironment() {
-    const char *flowId = getenv("TEAMCITY_PROCESS_FLOW_ID");
-    return flowId == NULL ? "" : flowId;
-}
+namespace jetbrains { namespace teamcity { namespace {
+/// Use RAII to write message open/close markers
+class RaiiMessage
+{
+public:
+    RaiiMessage(const char* const name, std::ostream& out)
+      : m_out(out)
+    {
+        // endl for http://jetbrains.net/tracker/issue/TW-4412
+        m_out << std::endl << "##teamcity[" << name;
+    }
+    ~RaiiMessage()
+    {
+        // endl for http://jetbrains.net/tracker/issue/TW-4412
+        m_out << "]" << std::endl;
+    }
+    /// \todo Copying char-by-char is ineffective!
+    std::string escape(const std::string s)
+    {
+        std::string result;
+
+        for (size_t i = 0; i < s.length(); i++)
+        {
+            char c = s[i];
+
+            switch (c)
+            {
+            case '\n': result.append("|n"); break;
+            case '\r': result.append("|r"); break;
+            case '\'': result.append("|'"); break;
+            case '|':  result.append("||"); break;
+            case ']':  result.append("|]"); break;
+            default:   result.append(&c, 1);
+            }
+        }
 
-bool underTeamcity() {
-    return getenv("TEAMCITY_PROJECT_NAME") != NULL;
-}
+        return result;
+    }
 
-TeamcityMessages::TeamcityMessages()
-: m_out(&cout)
-{}
+    void writeProperty(const char* const name, const std::string value)
+    {
+        m_out << ' ' << name << "='" << escape(value) << '\'';
+    }
 
-void TeamcityMessages::setOutput(ostream &out) {
-    m_out = &out;
-}
+    void writePropertyIfNonEmpty(const char* const name, const std::string value)
+    {
+        if (!value.empty())
+            writeProperty(name, value);
+    }
 
-string TeamcityMessages::escape(string s) {
-    string result;
-
-    for (size_t i = 0; i < s.length(); i++) {
-        char c = s[i];
-        
-        switch (c) {
-        case '\n': result.append("|n"); break;
-        case '\r': result.append("|r"); break;
-        case '\'': result.append("|'"); break;
-        case '|':  result.append("||"); break;
-        case ']':  result.append("|]"); break;
-        default:   result.append(1, c);
-        }
+private:
+    std::ostream& m_out;
+};
+}                                                           // anonymous namespace
+
+//BEGIN Public helper functions
+std::string getFlowIdFromEnvironment()
+{
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+    char* flowId = 0;
+    size_t sz = 0;
+    std::string result;
+    if (!_dupenv_s(&flowId, &sz, "TEAMCITY_PROCESS_FLOW_ID"))
+    {
+        result = flowId != 0 ? flowId : std::string();
+        free(flowId);
     }
 
     return result;
+#else
+    const char *flowId = getenv("TEAMCITY_PROCESS_FLOW_ID");
+    return flowId == 0 ? std::string() : flowId;
+#endif
 }
 
-void TeamcityMessages::openMsg(const string &name) {
-    // endl for http://jetbrains.net/tracker/issue/TW-4412
-    *m_out << endl << "##teamcity[" << name;
-}
+bool underTeamcity()
+{
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+    char* teamCityProjectName = 0;
+    size_t sz = 0;
+    bool result = false;
+    if (!_dupenv_s(&teamCityProjectName, &sz, "TEAMCITY_PROJECT_NAME"))
+    {
+        result = teamCityProjectName != 0;
+        free(teamCityProjectName);
+    }
 
-void TeamcityMessages::closeMsg() {
-    *m_out << "]";
-    // endl for http://jetbrains.net/tracker/issue/TW-4412
-    *m_out << endl;
-    m_out->flush();
+    return result;
+#else
+    return getenv("TEAMCITY_PROJECT_NAME") != 0;
+#endif
 }
+//END Public helper functions
 
-void TeamcityMessages::writeProperty(string name, string value) {
-    *m_out << " " << name << "='" << escape(value) << "'";
-}
+//BEGIN TeamcityMessages members
 
-void TeamcityMessages::suiteStarted(string name, string flowid) {
-    openMsg("testSuiteStarted");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
+TeamcityMessages::TeamcityMessages()
+  : m_out(&std::cout)
+{}
 
-    closeMsg();
+void TeamcityMessages::setOutput(std::ostream& out)
+{
+    m_out = &out;
 }
 
-void TeamcityMessages::suiteFinished(string name, string flowid) {
-    openMsg("testSuiteFinished");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
+void TeamcityMessages::suiteStarted(const std::string& name, const std::string& flowId)
+{
+    RaiiMessage msg("testSuiteStarted", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
+}
 
-    closeMsg();
+void TeamcityMessages::suiteFinished(const std::string& name, const std::string& flowId)
+{
+    RaiiMessage msg("testSuiteFinished", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::testStarted(string name, string flowid) {
-    openMsg("testStarted");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
+void TeamcityMessages::testStarted(const std::string& name, const std::string& flowId, const bool captureStandardOutput)
+{
+    RaiiMessage msg("testStarted", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 
-    closeMsg();
+    if (captureStandardOutput)
+        msg.writeProperty("captureStandardOutput", "true"); // false by default
 }
 
-void TeamcityMessages::testFinished(string name, int durationMs, string flowid) {
-    openMsg("testFinished");
+void TeamcityMessages::testFinished(const std::string& name, const int durationMs, const std::string& flowId)
+{
+    RaiiMessage msg("testFinished", *m_out);
 
-    writeProperty("name", name);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-
-    if(durationMs >= 0) {
-        stringstream out;
+    if (durationMs >= 0)
+    {
+        /// \bug W/ some locales it is possible to get a number w/ a number separator(s)!
+        /// \todo Make a test for that!
+        std::stringstream out(std::ios_base::out);
         out << durationMs;
-        writeProperty("duration", out.str());
+        msg.writeProperty("duration", out.str());
     }
-
-    closeMsg();
 }
 
-void TeamcityMessages::testFailed(string name, string message, string details, string flowid) {
-    openMsg("testFailed");
-    writeProperty("name", name);
-    writeProperty("message", message);
-    writeProperty("details", details);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-
-    closeMsg();
+void TeamcityMessages::testFailed(const std::string& name, const std::string& message, const std::string& details, const std::string& flowId)
+{
+    RaiiMessage msg("testFailed", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("message", message);
+    msg.writeProperty("details", details);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::testIgnored(std::string name, std::string message, string flowid) {
-    openMsg("testIgnored");
-    writeProperty("name", name);
-    writeProperty("message", message);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-
-    closeMsg();
+void TeamcityMessages::testIgnored(const std::string& name, const std::string& message, const std::string& flowId)
+{
+    RaiiMessage msg("testIgnored", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("message", message);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
+void TeamcityMessages::testOutput(const std::string& name, const std::string& output, const std::string& flowId, const bool isStdError)
+{
+    RaiiMessage msg(isStdError ? "testStdErr" : "testStdOut", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("out", output);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
+
+//END TeamcityMessages members
+}}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/odbc-test/src/test_utils.cpp b/modules/platforms/cpp/odbc-test/src/test_utils.cpp
index 68bd787..efe6d7a 100644
--- a/modules/platforms/cpp/odbc-test/src/test_utils.cpp
+++ b/modules/platforms/cpp/odbc-test/src/test_utils.cpp
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#include <boost/test/unit_test.hpp>
+
 #include <cassert>
 
 #include <ignite/common/platform_utils.h>
diff --git a/modules/platforms/cpp/odbc-test/src/transaction_test.cpp b/modules/platforms/cpp/odbc-test/src/transaction_test.cpp
index ed1b054..a15f8f5 100644
--- a/modules/platforms/cpp/odbc-test/src/transaction_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/transaction_test.cpp
@@ -24,10 +24,6 @@
 
 #include <string>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignition.h"
diff --git a/modules/platforms/cpp/odbc-test/src/types_test.cpp b/modules/platforms/cpp/odbc-test/src/types_test.cpp
index 00ab8bd..e1349f8 100644
--- a/modules/platforms/cpp/odbc-test/src/types_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/types_test.cpp
@@ -26,10 +26,6 @@
 #include <string>
 #include <algorithm>
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include "ignite/ignite.h"
diff --git a/modules/platforms/cpp/odbc-test/src/utility_test.cpp b/modules/platforms/cpp/odbc-test/src/utility_test.cpp
index f2955b7..7fe602c 100644
--- a/modules/platforms/cpp/odbc-test/src/utility_test.cpp
+++ b/modules/platforms/cpp/odbc-test/src/utility_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/impl/binary/binary_writer_impl.h>
@@ -94,4 +90,4 @@ BOOST_AUTO_TEST_CASE(TestUtilityWriteReadString)
     BOOST_REQUIRE(outStr4.empty());
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/platforms/cpp/thin-client-test/Makefile.am b/modules/platforms/cpp/thin-client-test/Makefile.am
index e4ab9a4..6d02c38 100644
--- a/modules/platforms/cpp/thin-client-test/Makefile.am
+++ b/modules/platforms/cpp/thin-client-test/Makefile.am
@@ -37,7 +37,8 @@ AM_CPPFLAGS = \
 	-I$(JAVA_HOME)/include/linux \
 	-DIGNITE_IMPL \
 	-D__STDC_LIMIT_MACROS \
-	-D__STDC_CONSTANT_MACROS
+	-D__STDC_CONSTANT_MACROS \
+	-DBOOST_TEST_DYN_LINK
 
 AM_CXXFLAGS = \
 	-Wall \
@@ -49,16 +50,17 @@ ignite_thin_client_tests_LDADD = \
 	-lpthread \
 	-lboost_thread \
 	-lboost_system \
-	-lboost_chrono
+	-lboost_chrono \
+	-lboost_unit_test_framework
 
 ignite_thin_client_tests_LDFLAGS = \
 	-static-libtool-libs \
 	-rdynamic
 
 ignite_thin_client_tests_SOURCES = \
-        src/cache_client_test.cpp \
         src/teamcity/teamcity_boost.cpp \
         src/teamcity/teamcity_messages.cpp \
+        src/cache_client_test.cpp \
         src/test_utils.cpp \
         src/ignite_client_test.cpp \
         src/auth_test.cpp \
diff --git a/modules/platforms/cpp/thin-client-test/include/teamcity/teamcity_messages.h b/modules/platforms/cpp/thin-client-test/include/teamcity/teamcity_messages.h
index 81a915b..f1f20e5 100644
--- a/modules/platforms/cpp/thin-client-test/include/teamcity/teamcity_messages.h
+++ b/modules/platforms/cpp/thin-client-test/include/teamcity/teamcity_messages.h
@@ -1,11 +1,11 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,35 +21,35 @@
 #include <string>
 #include <iostream>
 
-namespace JetBrains {
+namespace jetbrains { namespace teamcity {
 
 std::string getFlowIdFromEnvironment();
 bool underTeamcity();
 
-class TeamcityMessages {
-    std::ostream *m_out;
-
-protected:
-    std::string escape(std::string s);
-
-    void openMsg(const std::string &name);
-    void writeProperty(std::string name, std::string value);
-    void closeMsg();
+class TeamcityMessages
+{
+    std::ostream* m_out;
 
 public:
+    static const bool StdErr = true;
+    static const bool StdOut = false;
+
     TeamcityMessages();
 
-    void setOutput(std::ostream &);
+    void setOutput(std::ostream&);
+
+    void suiteStarted(const std::string& name, const std::string& flowid = std::string());
+    void suiteFinished(const std::string& name, const std::string& flowid = std::string());
+
+    void testStarted(const std::string& name, const std::string& flowid = std::string(), bool captureStandardOutput = false);
+    void testFinished(const std::string& name, int durationMs = -1, const std::string& flowid = std::string());
 
-    void suiteStarted(std::string name, std::string flowid = "");
-    void suiteFinished(std::string name, std::string flowid = "");
+    void testFailed(const std::string& name, const std::string& message, const std::string& details, const std::string& flowid = std::string());
+    void testIgnored(const std::string& name, const std::string& message, const std::string& flowid = std::string());
 
-    void testStarted(std::string name, std::string flowid = "");
-    void testFailed(std::string name, std::string message, std::string details, std::string flowid = "");
-    void testIgnored(std::string name, std::string message, std::string flowid = "");
-    void testFinished(std::string name, int durationMs = -1, std::string flowid = "");    
+    void testOutput(const std::string& name, const std::string& output, const std::string& flowid, bool isStdErr = StdOut);
 };
 
-}
+}} // namespace teamcity, jetbrains
 
 #endif /* H_TEAMCITY_MESSAGES */
diff --git a/modules/platforms/cpp/thin-client-test/include/test_utils.h b/modules/platforms/cpp/thin-client-test/include/test_utils.h
index 653e7da..0d8e2b6 100644
--- a/modules/platforms/cpp/thin-client-test/include/test_utils.h
+++ b/modules/platforms/cpp/thin-client-test/include/test_utils.h
@@ -22,6 +22,14 @@
 
 #include <ignite/ignition.h>
 
+#define MUTE_TEST_FOR_TEAMCITY \
+    if (jetbrains::teamcity::underTeamcity()) \
+    { \
+        BOOST_TEST_MESSAGE("Muted on TeamCity because of periodical non-critical failures"); \
+        BOOST_CHECK(jetbrains::teamcity::underTeamcity()); \
+        return; \
+    }
+
 namespace ignite_test
 {
     /**
diff --git a/modules/platforms/cpp/thin-client-test/project/vs/thin-client-test.vcxproj b/modules/platforms/cpp/thin-client-test/project/vs/thin-client-test.vcxproj
index 5d5729f..ee719f1 100644
--- a/modules/platforms/cpp/thin-client-test/project/vs/thin-client-test.vcxproj
+++ b/modules/platforms/cpp/thin-client-test/project/vs/thin-client-test.vcxproj
@@ -126,7 +126,7 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(BOOST_HOME)\lib64-msvc-10.0\libboost_unit_test_framework-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_thread-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_system-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_chrono-vc100-mt-gd-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB64_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_system-$(BOOST_LIB_SUFIX_D64).lib;$(BOOST_LIB64_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_D64).lib;%(AdditionalDependencies)</AdditionalDependencies>
       <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
@@ -141,7 +141,8 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(BOOST_HOME)\lib32-msvc-10.0\libboost_unit_test_framework-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_thread-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_system-vc100-mt-gd-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_chrono-vc100-mt-gd-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB32_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_system-$(BOOST_LIB_SUFIX_D32).lib;$(BOOST_LIB32_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_D32).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -159,7 +160,8 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>$(BOOST_HOME)\lib64-msvc-10.0\libboost_unit_test_framework-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_thread-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_system-vc100-mt-1_58.lib;$(BOOST_HOME)\lib64-msvc-10.0\libboost_chrono-vc100-mt-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB64_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_system-$(BOOST_LIB_SUFIX_R64).lib;$(BOOST_LIB64_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_R64).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -177,10 +179,11 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>$(BOOST_HOME)\lib32-msvc-10.0\libboost_unit_test_framework-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_thread-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_system-vc100-mt-1_58.lib;$(BOOST_HOME)\lib32-msvc-10.0\libboost_chrono-vc100-mt-1_58.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(BOOST_LIB32_PATH)\libboost_unit_test_framework-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_thread-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_system-$(BOOST_LIB_SUFIX_R32).lib;$(BOOST_LIB32_PATH)\libboost_chrono-$(BOOST_LIB_SUFIX_R32).lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SubSystem>Console</SubSystem>
     </Link>
   </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/modules/platforms/cpp/thin-client-test/src/auth_test.cpp b/modules/platforms/cpp/thin-client-test/src/auth_test.cpp
index d241a9d..14a635a 100644
--- a/modules/platforms/cpp/thin-client-test/src/auth_test.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/auth_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/ignition.h>
diff --git a/modules/platforms/cpp/thin-client-test/src/cache_client_test.cpp b/modules/platforms/cpp/thin-client-test/src/cache_client_test.cpp
index d5c7f5f..10627ba 100644
--- a/modules/platforms/cpp/thin-client-test/src/cache_client_test.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/cache_client_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 #include <boost/thread/thread.hpp>
 
diff --git a/modules/platforms/cpp/thin-client-test/src/ignite_client_test.cpp b/modules/platforms/cpp/thin-client-test/src/ignite_client_test.cpp
index 4dbc7f7..0010d4f 100644
--- a/modules/platforms/cpp/thin-client-test/src/ignite_client_test.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/ignite_client_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/ignition.h>
diff --git a/modules/platforms/cpp/thin-client-test/src/ssl_test.cpp b/modules/platforms/cpp/thin-client-test/src/ssl_test.cpp
index eaadd9b..deac62f 100644
--- a/modules/platforms/cpp/thin-client-test/src/ssl_test.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/ssl_test.cpp
@@ -15,10 +15,6 @@
  * limitations under the License.
  */
 
-#ifndef _MSC_VER
-#   define BOOST_TEST_DYN_LINK
-#endif
-
 #include <boost/test/unit_test.hpp>
 
 #include <ignite/ignition.h>
diff --git a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp
index 2f3afe9..9a06bb9 100644
--- a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_boost.cpp
@@ -1,159 +1,279 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ * Copyright 2015-2017 Alex Turbov <i....@gmail.com>
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- * 
+ *
  * $Revision: 88625 $
-*/
+ */
 
 #define BOOST_TEST_MODULE IgniteThinClientTest
 
-#include <sstream>
+#include "teamcity/teamcity_messages.h"
 
-#include <boost/test/unit_test_suite_impl.hpp>
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 105900
+# include <boost/test/execution_monitor.hpp>
+#else                                                       // BOOST_VERSION < 105900
+# include <boost/test/unit_test_suite_impl.hpp>
+#endif                                                      // BOOST_VERSION < 105900
 #include <boost/test/results_collector.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/unit_test_log.hpp>
-#include <boost/test/included/unit_test.hpp>
+#include <boost/test/unit_test_log_formatter.hpp>
+#include <boost/test/unit_test.hpp>
 
-#include "teamcity/teamcity_messages.h"
+#include <sstream>
 
-using namespace boost::unit_test;
-using namespace std;
+namespace jetbrains { namespace teamcity { namespace {
+const std::string ASSERT_CTX = "Assertion has occurred in a following context:";
+const std::string FAILURE_CTX = "Failure has occurred in a following context:";
+const boost::unit_test::test_unit_type UNIT_TEST_CASE =
+#if BOOST_VERSION < 105900
+    boost::unit_test::tut_case
+#else                                                       // BOOST_VERSION >= 105900
+    boost::unit_test::TUT_CASE
+#endif                                                      // BOOST_VERSION >= 105900
+  ;
+
+// Formatter implementation
+std::string toString(boost::unit_test::const_string bstr)
+{
+    std::stringstream ss(std::ios_base::out);
+    ss << bstr;
+    return ss.str();
+}
 
-namespace JetBrains {
+std::string toString(const boost::execution_exception& excpt)
+{
+    std::stringstream ss(std::ios_base::out);
+    ss << excpt.what();
+    return ss.str();
+}
+}                                                           // anonymous namespace
 
-// Custom formatter for TeamCity messages
-class TeamcityBoostLogFormatter: public boost::unit_test::unit_test_log_formatter {
+/// Custom formatter for TeamCity messages
+class TeamcityBoostLogFormatter : public boost::unit_test::unit_test_log_formatter
+{
     TeamcityMessages messages;
     std::string currentDetails;
     std::string flowId;
-    
+#if BOOST_VERSION >= 105900
+    std::string currentContextDetails;
+#endif                                                      // BOOST_VERSION >= 105900
+
 public:
-    TeamcityBoostLogFormatter(const std::string &_flowId);
+    TeamcityBoostLogFormatter(const std::string& flowId);
     TeamcityBoostLogFormatter();
-    
-    void log_start(std::ostream&, boost::unit_test::counter_t test_cases_amount);
-    void log_finish(std::ostream&);
-    void log_build_info(std::ostream&);
-
-    void test_unit_start(std::ostream&, boost::unit_test::test_unit const& tu);
-    void test_unit_finish(std::ostream&,
-        boost::unit_test::test_unit const& tu,
-        unsigned long elapsed);
-    void test_unit_skipped(std::ostream&, boost::unit_test::test_unit const& tu);
-
-    void log_exception(std::ostream&,
-        boost::unit_test::log_checkpoint_data const&,
-        boost::unit_test::const_string explanation);
-
-    void log_entry_start(std::ostream&,
-        boost::unit_test::log_entry_data const&,
-        log_entry_types let);
-    void log_entry_value(std::ostream&, boost::unit_test::const_string value);
-    void log_entry_finish(std::ostream&);
+
+    virtual ~TeamcityBoostLogFormatter() {}
+
+    virtual void log_start(std::ostream&, boost::unit_test::counter_t);
+    virtual void log_finish(std::ostream&);
+    virtual void log_build_info(std::ostream&);
+
+    virtual void test_unit_start(std::ostream&, const boost::unit_test::test_unit&);
+    virtual void test_unit_finish(std::ostream&, const boost::unit_test::test_unit&, unsigned long);
+
+    virtual void log_entry_start(std::ostream&, const boost::unit_test::log_entry_data&, log_entry_types);
+    virtual void log_entry_value(std::ostream&, boost::unit_test::const_string);
+    virtual void log_entry_finish(std::ostream&);
+
+#if BOOST_VERSION < 105900
+    virtual void log_exception(std::ostream&, const boost::unit_test::log_checkpoint_data&, boost::unit_test::const_string);
+    virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&);
+#else                                                       // BOOST_VERSION >= 105900
+    virtual void log_exception_start(std::ostream&,const boost::unit_test::log_checkpoint_data&, const boost::execution_exception&);
+    virtual void test_unit_skipped(std::ostream&, const boost::unit_test::test_unit&, boost::unit_test::const_string);
+
+    virtual void log_exception_finish(std::ostream&);
+    virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
+# if BOOST_VERSION < 106500
+    virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
+    virtual void entry_context_finish(std::ostream&);
+# else                                                      // BOOST_VERSION >= 106500
+    virtual void log_entry_context(std::ostream&, boost::unit_test::log_level, boost::unit_test::const_string);
+    virtual void entry_context_finish(std::ostream&, boost::unit_test::log_level);
+# endif                                                     // BOOST_VERSION >= 106500
+#endif                                                      // BOOST_VERSION >= 105900
 };
 
 // Fake fixture to register formatter
-struct TeamcityFormatterRegistrar {
-    TeamcityFormatterRegistrar() {
-        if (JetBrains::underTeamcity()) {
-            boost::unit_test::unit_test_log.set_formatter(new JetBrains::TeamcityBoostLogFormatter());
-            boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_successful_tests);
+struct TeamcityFormatterRegistrar
+{
+    TeamcityFormatterRegistrar()
+    {
+        if (underTeamcity())
+        {
+            boost::unit_test::unit_test_log.set_formatter(new TeamcityBoostLogFormatter());
+            boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_test_units);
         }
     }
 };
-BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
 
-// Formatter implementation
-string toString(const_string bstr) {
-    stringstream ss;
-    
-    ss << bstr;
-    
-    return ss.str();
-}
+#if BOOST_VERSION < 106500
+    BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+#else                                                       // BOOST_VERSION >= 106500
+    BOOST_TEST_GLOBAL_CONFIGURATION(TeamcityFormatterRegistrar);
+#endif                                                      // BOOST_VERSION >= 106500
 
-TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string &_flowId)
-: flowId(_flowId)
+TeamcityBoostLogFormatter::TeamcityBoostLogFormatter(const std::string& id)
+  : flowId(id)
 {}
 
 TeamcityBoostLogFormatter::TeamcityBoostLogFormatter()
-: flowId(getFlowIdFromEnvironment())
+  : flowId(getFlowIdFromEnvironment())
 {}
 
-void TeamcityBoostLogFormatter::log_start(ostream &out, counter_t test_cases_amount)
-{}
+void TeamcityBoostLogFormatter::log_start(std::ostream& out, boost::unit_test::counter_t /*test_cases_amount*/)
+{
+    messages.setOutput(out);
+}
 
-void TeamcityBoostLogFormatter::log_finish(ostream &out)
+void TeamcityBoostLogFormatter::log_finish(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::log_build_info(ostream &out)
+void TeamcityBoostLogFormatter::log_build_info(std::ostream& /*out*/)
 {}
 
-void TeamcityBoostLogFormatter::test_unit_start(ostream &out, test_unit const& tu) {
-    messages.setOutput(out);
-
-    if (tu.p_type == tut_case) {
+void TeamcityBoostLogFormatter::test_unit_start(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+{
+    if (tu.p_type == UNIT_TEST_CASE)
         messages.testStarted(tu.p_name, flowId);
-    } else {
+    else
         messages.suiteStarted(tu.p_name, flowId);
-    }
-    
+
     currentDetails.clear();
 }
 
-void TeamcityBoostLogFormatter::test_unit_finish(ostream &out, test_unit const& tu, unsigned long elapsed) {
-    messages.setOutput(out);
-
-    test_results const& tr = results_collector.results(tu.p_id);
-    if (tu.p_type == tut_case) {
-        if(!tr.passed()) {
-            if(tr.p_skipped) {
+void TeamcityBoostLogFormatter::test_unit_finish(std::ostream& /*out*/, const boost::unit_test::test_unit& tu, unsigned long elapsed)
+{
+    const boost::unit_test::test_results& tr = boost::unit_test::results_collector.results(tu.p_id);
+    if (tu.p_type == UNIT_TEST_CASE)
+    {
+        if (!tr.passed())
+        {
+            if (tr.p_skipped)
                 messages.testIgnored(tu.p_name, "ignored", flowId);
-            } else if (tr.p_aborted) {
+            else if (tr.p_aborted)
                 messages.testFailed(tu.p_name, "aborted", currentDetails, flowId);
-            } else {
+            else
                 messages.testFailed(tu.p_name, "failed", currentDetails, flowId);
-            }
         }
-        
+
         messages.testFinished(tu.p_name, elapsed / 1000, flowId);
-    } else {
+    }
+    else
+    {
         messages.suiteFinished(tu.p_name, flowId);
     }
 }
 
-void TeamcityBoostLogFormatter::test_unit_skipped(ostream &out, test_unit const& tu)
-{}
+void TeamcityBoostLogFormatter::log_entry_start(std::ostream& out, const boost::unit_test::log_entry_data& entry_data, log_entry_types /*let*/)
+{
+    std::stringstream ss(std::ios_base::out);
 
-void TeamcityBoostLogFormatter::log_exception(ostream &out, log_checkpoint_data const&, const_string explanation) {
-    string what = toString(explanation);
-    
-    out << what << endl;
-    currentDetails += what + "\n";
-}
+    out << entry_data.m_file_name << "(" << entry_data.m_line_num << "): ";
+    ss  << entry_data.m_file_name << "(" << entry_data.m_line_num << "): ";
 
-void TeamcityBoostLogFormatter::log_entry_start(ostream&, log_entry_data const&, log_entry_types let)
-{}
+    currentDetails += ss.str();
+}
 
-void TeamcityBoostLogFormatter::log_entry_value(ostream &out, const_string value) {
+void TeamcityBoostLogFormatter::log_entry_value(std::ostream& out, boost::unit_test::const_string value)
+{
     out << value;
     currentDetails += toString(value);
 }
 
-void TeamcityBoostLogFormatter::log_entry_finish(ostream &out) {
-    out << endl;
-    currentDetails += "\n";
+void TeamcityBoostLogFormatter::log_entry_finish(std::ostream& out)
+{
+    out << '\n';
+    currentDetails += '\n';
 }
 
+#if BOOST_VERSION < 105900
+
+void TeamcityBoostLogFormatter::log_exception(
+    std::ostream& out
+  , const boost::unit_test::log_checkpoint_data&
+  , boost::unit_test::const_string explanation
+  )
+{
+    out << explanation << '\n';
+    currentDetails += toString(explanation) + '\n';
 }
+
+void TeamcityBoostLogFormatter::test_unit_skipped(std::ostream& /*out*/, const boost::unit_test::test_unit& tu)
+{
+    messages.testIgnored(tu.p_name, "test ignored", flowId);
+}
+
+#else                                                       // BOOST_VERSION >= 105900
+
+void TeamcityBoostLogFormatter::log_exception_start(
+    std::ostream& out
+  , const boost::unit_test::log_checkpoint_data&
+  , const boost::execution_exception& excpt
+  )
+{
+    const std::string what = toString(excpt);
+
+    out << what << '\n';
+    currentDetails += what + '\n';
+}
+
+void TeamcityBoostLogFormatter::test_unit_skipped(
+    std::ostream& /*out*/
+  , const boost::unit_test::test_unit& tu
+  , boost::unit_test::const_string reason
+  )
+{
+    messages.testIgnored(tu.p_name, toString(reason), flowId);
+}
+
+void TeamcityBoostLogFormatter::log_exception_finish(std::ostream& /*out*/)
+{}
+
+void TeamcityBoostLogFormatter::entry_context_start(std::ostream& out, boost::unit_test::log_level l)
+{
+    const std::string& initial_msg = (l == boost::unit_test::log_successful_tests ? ASSERT_CTX : FAILURE_CTX);
+    out << initial_msg;
+    currentContextDetails = initial_msg;
+}
+
+# if BOOST_VERSION < 106500
+void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::const_string ctx)
+# else                                                      // BOOST_VERSION >= 106500
+void TeamcityBoostLogFormatter::log_entry_context(std::ostream& out, boost::unit_test::log_level, boost::unit_test::const_string ctx)
+# endif                                                     // BOOST_VERSION >= 106500
+{
+    out << "\n " << ctx;
+    currentContextDetails += "\n " + toString(ctx);
+}
+
+# if BOOST_VERSION < 106500
+void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out)
+# else                                                      // BOOST_VERSION >= 106500
+void TeamcityBoostLogFormatter::entry_context_finish(std::ostream& out, boost::unit_test::log_level)
+# endif                                                     // BOOST_VERSION >= 106500
+{
+    out.flush();
+    messages.testOutput(
+        boost::unit_test_framework::framework::current_test_case().full_name()
+      , currentContextDetails
+      , flowId
+      , TeamcityMessages::StdErr
+      );
+}
+
+#endif                                                      // BOOST_VERSION >= 105900
+}}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp
index 2837542..068b1d6 100644
--- a/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/teamcity/teamcity_messages.cpp
@@ -1,11 +1,11 @@
 /* Copyright 2011 JetBrains s.r.o.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,136 +15,182 @@
  * $Revision: 88625 $
 */
 
-#include <stdlib.h>
-#include <sstream>
-
 #include "teamcity/teamcity_messages.h"
 
-using namespace std;
+#include <cstdlib>
+#include <iostream>
+#include <sstream>
 
-namespace JetBrains {
+namespace jetbrains { namespace teamcity { namespace {
+/// Use RAII to write message open/close markers
+class RaiiMessage
+{
+public:
+    RaiiMessage(const char* const name, std::ostream& out)
+      : m_out(out)
+    {
+        // endl for http://jetbrains.net/tracker/issue/TW-4412
+        m_out << std::endl << "##teamcity[" << name;
+    }
+    ~RaiiMessage()
+    {
+        // endl for http://jetbrains.net/tracker/issue/TW-4412
+        m_out << "]" << std::endl;
+    }
+    /// \todo Copying char-by-char is ineffective!
+    std::string escape(const std::string s)
+    {
+        std::string result;
+
+        for (size_t i = 0; i < s.length(); i++)
+        {
+            char c = s[i];
+
+            switch (c)
+            {
+            case '\n': result.append("|n"); break;
+            case '\r': result.append("|r"); break;
+            case '\'': result.append("|'"); break;
+            case '|':  result.append("||"); break;
+            case ']':  result.append("|]"); break;
+            default:   result.append(&c, 1);
+            }
+        }
 
-std::string getFlowIdFromEnvironment() {
-    const char *flowId = getenv("TEAMCITY_PROCESS_FLOW_ID");
-    return flowId == NULL ? "" : flowId;
-}
+        return result;
+    }
 
-bool underTeamcity() {
-    return getenv("TEAMCITY_PROJECT_NAME") != NULL;
-}
+    void writeProperty(const char* const name, const std::string value)
+    {
+        m_out << ' ' << name << "='" << escape(value) << '\'';
+    }
 
-TeamcityMessages::TeamcityMessages()
-: m_out(&cout)
-{}
+    void writePropertyIfNonEmpty(const char* const name, const std::string value)
+    {
+        if (!value.empty())
+            writeProperty(name, value);
+    }
 
-void TeamcityMessages::setOutput(ostream &out) {
-    m_out = &out;
+private:
+    std::ostream& m_out;
+};
+}                                                           // anonymous namespace
+
+//BEGIN Public helper functions
+std::string getFlowIdFromEnvironment()
+{
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+    char* flowId = 0;
+    size_t sz = 0;
+    std::string result;
+    if (!_dupenv_s(&flowId, &sz, "TEAMCITY_PROCESS_FLOW_ID"))
+    {
+        result = flowId != 0 ? flowId : std::string();
+        free(flowId);
+    }
+
+    return result;
+#else
+    const char *flowId = getenv("TEAMCITY_PROCESS_FLOW_ID");
+    return flowId == 0 ? std::string() : flowId;
+#endif
 }
 
-string TeamcityMessages::escape(string s) {
-    string result;
-    
-    for (size_t i = 0; i < s.length(); i++) {
-        char c = s[i];
-        
-        switch (c) {
-        case '\n': result.append("|n"); break;
-        case '\r': result.append("|r"); break;
-        case '\'': result.append("|'"); break;
-        case '|':  result.append("||"); break;
-        case ']':  result.append("|]"); break;
-        default:   result.append(&c, 1);
-        }
+bool underTeamcity()
+{
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
+    char* teamCityProjectName = 0;
+    size_t sz = 0;
+    bool result = false;
+    if (!_dupenv_s(&teamCityProjectName, &sz, "TEAMCITY_PROJECT_NAME"))
+    {
+        result = teamCityProjectName != 0;
+        free(teamCityProjectName);
     }
-    
+
     return result;
+#else
+    return getenv("TEAMCITY_PROJECT_NAME") != 0;
+#endif
 }
+//END Public helper functions
 
-void TeamcityMessages::openMsg(const string &name) {
-    // endl for http://jetbrains.net/tracker/issue/TW-4412
-    *m_out << endl << "##teamcity[" << name;
-}
+//BEGIN TeamcityMessages members
 
-void TeamcityMessages::closeMsg() {
-    *m_out << "]";
-    // endl for http://jetbrains.net/tracker/issue/TW-4412
-    *m_out << endl;
-    m_out->flush();
-}
+TeamcityMessages::TeamcityMessages()
+  : m_out(&std::cout)
+{}
 
-void TeamcityMessages::writeProperty(string name, string value) {
-    *m_out << " " << name << "='" << escape(value) << "'";
+void TeamcityMessages::setOutput(std::ostream& out)
+{
+    m_out = &out;
 }
 
-void TeamcityMessages::suiteStarted(string name, string flowid) {
-    openMsg("testSuiteStarted");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::suiteStarted(const std::string& name, const std::string& flowId)
+{
+    RaiiMessage msg("testSuiteStarted", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::suiteFinished(string name, string flowid) {
-    openMsg("testSuiteFinished");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::suiteFinished(const std::string& name, const std::string& flowId)
+{
+    RaiiMessage msg("testSuiteFinished", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::testStarted(string name, string flowid) {
-    openMsg("testStarted");
-    writeProperty("name", name);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::testStarted(const std::string& name, const std::string& flowId, const bool captureStandardOutput)
+{
+    RaiiMessage msg("testStarted", *m_out);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
+
+    if (captureStandardOutput)
+        msg.writeProperty("captureStandardOutput", "true"); // false by default
 }
 
-void TeamcityMessages::testFinished(string name, int durationMs, string flowid) {
-    openMsg("testFinished");
+void TeamcityMessages::testFinished(const std::string& name, const int durationMs, const std::string& flowId)
+{
+    RaiiMessage msg("testFinished", *m_out);
 
-    writeProperty("name", name);
+    msg.writeProperty("name", name);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-
-    if(durationMs >= 0) {
-        stringstream out;
+    if (durationMs >= 0)
+    {
+        /// \bug W/ some locales it is possible to get a number w/ a number separator(s)!
+        /// \todo Make a test for that!
+        std::stringstream out(std::ios_base::out);
         out << durationMs;
-        writeProperty("duration", out.str());
+        msg.writeProperty("duration", out.str());
     }
-    
-    closeMsg();
 }
 
-void TeamcityMessages::testFailed(string name, string message, string details, string flowid) {
-    openMsg("testFailed");
-    writeProperty("name", name);
-    writeProperty("message", message);
-    writeProperty("details", details);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::testFailed(const std::string& name, const std::string& message, const std::string& details, const std::string& flowId)
+{
+    RaiiMessage msg("testFailed", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("message", message);
+    msg.writeProperty("details", details);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
-void TeamcityMessages::testIgnored(std::string name, std::string message, string flowid) {
-    openMsg("testIgnored");
-    writeProperty("name", name);
-    writeProperty("message", message);
-    if(flowid.length() > 0) {
-        writeProperty("flowId", flowid);
-    }
-    
-    closeMsg();
+void TeamcityMessages::testIgnored(const std::string& name, const std::string& message, const std::string& flowId)
+{
+    RaiiMessage msg("testIgnored", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("message", message);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
 
+void TeamcityMessages::testOutput(const std::string& name, const std::string& output, const std::string& flowId, const bool isStdError)
+{
+    RaiiMessage msg(isStdError ? "testStdErr" : "testStdOut", *m_out);
+    msg.writeProperty("name", name);
+    msg.writeProperty("out", output);
+    msg.writePropertyIfNonEmpty("flowId", flowId);
 }
+
+//END TeamcityMessages members
+}}                                                          // namespace teamcity, jetbrains
diff --git a/modules/platforms/cpp/thin-client-test/src/test_utils.cpp b/modules/platforms/cpp/thin-client-test/src/test_utils.cpp
index a60e392..0789581 100644
--- a/modules/platforms/cpp/thin-client-test/src/test_utils.cpp
+++ b/modules/platforms/cpp/thin-client-test/src/test_utils.cpp
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#include <boost/test/unit_test.hpp>
+
 #include <cassert>
 
 #include <ignite/common/platform_utils.h>