--- /dev/null
+--- a/c++/include/corelib/teamcity_messages.h
++++ b/c++/include/corelib/teamcity_messages.h
+@@ -33,9 +33,9 @@ protected:
+ std::ostream *m_out;
+
+ public:
+- std::string escape(std::string s);
++ std::string escape(const std::string &s);
+ void openMsg(const std::string &name);
+- void writeProperty(std::string name, std::string value);
++ void writeProperty(const std::string &name, const std::string &value);
+ void closeMsg();
+
+ public:
+@@ -46,14 +46,14 @@ public:
+
+ void setOutput(std::ostream &);
+
+- void suiteStarted(std::string name, std::string flowid = std::string());
+- void suiteFinished(std::string name, std::string flowid = std::string());
++ 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(std::string name, std::string flowid = std::string(), bool captureStandardOutput = false);
+- void testFailed(std::string name, std::string message, std::string details, std::string flowid = std::string());
+- void testIgnored(std::string name, std::string message, std::string flowid = std::string());
+- void testOutput(std::string name, std::string output, std::string flowid, bool isStdErr = StdOut);
+- void testFinished(std::string name, int durationMs = -1, std::string flowid = std::string());
++ void testStarted(const std::string &name, const std::string &flowid = std::string(), bool captureStandardOutput = false);
++ 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);
++ void testFinished(const std::string &name, int durationMs = -1, const std::string &flowid = std::string());
+ };
+
+ }
+--- a/c++/src/corelib/teamcity_boost.cpp
++++ b/c++/src/corelib/teamcity_boost.cpp
+@@ -83,6 +83,17 @@ public:
+ virtual void entry_context_start(std::ostream&, boost::unit_test::log_level);
+ virtual void log_entry_context(std::ostream&, boost::unit_test::const_string);
+ virtual void entry_context_finish(std::ostream&);
++
++#if BOOST_VERSION >= 106500
++ // Since v1.65.0 the log level is passed to the formatters for the contexts
++ // See boostorg/test.git:fcb302b66ea09c25f0682588d22fbfdf59eac0f7
++ void log_entry_context(std::ostream& os, boost::unit_test::log_level, boost::unit_test::const_string ctx) override {
++ log_entry_context(os, ctx);
++ }
++ void entry_context_finish(std::ostream& os, boost::unit_test::log_level) override {
++ entry_context_finish(os);
++ }
++#endif
+ };
+
+ // Fake fixture to register formatter
+@@ -90,14 +101,17 @@ struct TeamcityFormatterRegistrar {
+ TeamcityFormatterRegistrar() {
+ if (underTeamcity()) {
+ boost::unit_test::unit_test_log.set_formatter(new TeamcityBoostLogFormatter());
+- boost::unit_test::unit_test_log.set_threshold_level
+- (RTCFG(but::log_level, LOG_LEVEL, log_level));
++ boost::unit_test::unit_test_log.set_threshold_level(boost::unit_test::log_test_units);
+ }
+ }
+ };
+
+ BOOST_GLOBAL_FIXTURE(TeamcityFormatterRegistrar);
+
++// Dummy method used to keep object file in case of static library linking
++// See README.md and https://github.com/JetBrains/teamcity-cpp/pull/19
++void TeamcityGlobalFixture() {}
++
+ // Formatter implementation
+ static std::string toString(boost::unit_test::const_string bstr) {
+ std::stringstream ss;
+--- a/c++/src/corelib/teamcity_messages.cpp
++++ b/c++/src/corelib/teamcity_messages.cpp
+@@ -26,7 +26,7 @@ namespace jetbrains {
+ namespace teamcity {
+
+ std::string getFlowIdFromEnvironment() {
+-#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)) && 0
++#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && 0
+ char *flowId = NULL;
+ size_t sz = 0;
+ std::string result;
+@@ -43,7 +43,7 @@ std::string getFlowIdFromEnvironment() {
+ }
+
+ bool underTeamcity() {
+-#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)) && 0
++#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) && !defined(__MINGW32__) && 0
+ char *teamCityProjectName = 0;
+ size_t sz = 0;
+ bool result = false;
+@@ -66,8 +66,9 @@ void TeamcityMessages::setOutput(std::os
+ m_out = &out;
+ }
+
+-std::string TeamcityMessages::escape(std::string s) {
++std::string TeamcityMessages::escape(const std::string &s) {
+ std::string result;
++ result.reserve(s.length());
+
+ for (size_t i = 0; i < s.length(); i++) {
+ char c = s[i];
+@@ -86,8 +87,7 @@ std::string TeamcityMessages::escape(std
+ }
+
+ void TeamcityMessages::openMsg(const std::string &name) {
+- // endl for http://jetbrains.net/tracker/issue/TW-4412
+- *m_out << std::endl << "##teamcity[" << name;
++ *m_out << "##teamcity[" << name;
+ }
+
+ void TeamcityMessages::closeMsg() {
+@@ -96,11 +96,11 @@ void TeamcityMessages::closeMsg() {
+ *m_out << std::endl;
+ }
+
+-void TeamcityMessages::writeProperty(std::string name, std::string value) {
++void TeamcityMessages::writeProperty(const std::string &name, const std::string &value) {
+ *m_out << " " << name << "='" << escape(value) << "'";
+ }
+
+-void TeamcityMessages::suiteStarted(std::string name, std::string flowid) {
++void TeamcityMessages::suiteStarted(const std::string &name, const std::string &flowid) {
+ openMsg("testSuiteStarted");
+ writeProperty("name", name);
+ if(flowid.length() > 0) {
+@@ -110,7 +110,7 @@ void TeamcityMessages::suiteStarted(std:
+ closeMsg();
+ }
+
+-void TeamcityMessages::suiteFinished(std::string name, std::string flowid) {
++void TeamcityMessages::suiteFinished(const std::string &name, const std::string &flowid) {
+ openMsg("testSuiteFinished");
+ writeProperty("name", name);
+ if(flowid.length() > 0) {
+@@ -120,7 +120,7 @@ void TeamcityMessages::suiteFinished(std
+ closeMsg();
+ }
+
+-void TeamcityMessages::testStarted(std::string name, std::string flowid, bool captureStandardOutput) {
++void TeamcityMessages::testStarted(const std::string &name, const std::string &flowid, bool captureStandardOutput) {
+ openMsg("testStarted");
+ writeProperty("name", name);
+ if(flowid.length() > 0) {
+@@ -134,7 +134,7 @@ void TeamcityMessages::testStarted(std::
+ closeMsg();
+ }
+
+-void TeamcityMessages::testFinished(std::string name, int durationMs, std::string flowid) {
++void TeamcityMessages::testFinished(const std::string &name, int durationMs, const std::string &flowid) {
+ openMsg("testFinished");
+
+ writeProperty("name", name);
+@@ -152,7 +152,7 @@ void TeamcityMessages::testFinished(std:
+ closeMsg();
+ }
+
+-void TeamcityMessages::testFailed(std::string name, std::string message, std::string details, std::string flowid) {
++void TeamcityMessages::testFailed(const std::string &name, const std::string &message, const std::string &details, const std::string &flowid) {
+ openMsg("testFailed");
+ writeProperty("name", name);
+ writeProperty("message", message);
+@@ -164,7 +164,7 @@ void TeamcityMessages::testFailed(std::s
+ closeMsg();
+ }
+
+-void TeamcityMessages::testIgnored(std::string name, std::string message, std::string flowid) {
++void TeamcityMessages::testIgnored(const std::string &name, const std::string &message, const std::string &flowid) {
+ openMsg("testIgnored");
+ writeProperty("name", name);
+ writeProperty("message", message);
+@@ -175,7 +175,7 @@ void TeamcityMessages::testIgnored(std::
+ closeMsg();
+ }
+
+-void TeamcityMessages::testOutput(std::string name, std::string output, std::string flowid, bool isStdError) {
++void TeamcityMessages::testOutput(const std::string &name, const std::string &output, const std::string &flowid, bool isStdError) {
+ openMsg(isStdError ? "testStdErr" : "testStdOut");
+ writeProperty("name", name);
+ writeProperty("out", output);
+--- a/c++/src/corelib/test_boost.cpp
++++ b/c++/src/corelib/test_boost.cpp
+@@ -95,8 +95,15 @@
+
+ #if BOOST_VERSION >= 106000
+ # define attr_value utils::attr_value
+-# define RTCFG(type, new_name, old_name) \
+- but::runtime_config::get<type >(but::runtime_config::new_name)
++# if BOOST_VERSION >= 106400
++ // Everything old is new again, apparently...
++# define RTCFG(type, new_name, old_name) \
++ but::runtime_config::get<type >(but::runtime_config::btrt_##old_name)
++# define CONFIGURED_FILTERS RTCFG(std::vector<std::string>, _, run_filters)
++# else
++# define RTCFG(type, new_name, old_name) \
++ but::runtime_config::get<type >(but::runtime_config::new_name)
++# endif
+ #else
+ # define RTCFG(type, new_name, old_name) but::runtime_config::old_name()
+ # if BOOST_VERSION >= 105900
+@@ -112,8 +119,10 @@
+ # endif
+ #endif
+
+-#define CONFIGURED_FILTERS \
++#ifndef CONFIGURED_FILTERS
++ #define CONFIGURED_FILTERS \
+ RTCFG(std::vector<std::string>, RUN_FILTERS, test_to_run)
++#endif
+
+ #ifdef NCBI_COMPILER_MSVC
+ # pragma warning(pop)
+@@ -278,11 +287,19 @@ public:
+ virtual
+ void entry_context_start(ostream& ostr, but::log_level l);
+
++# if BOOST_VERSION >= 106500
++ virtual
++ void log_entry_context(ostream& os, but::log_level l, but::const_string v);
++
++ virtual
++ void entry_context_finish(ostream& os, but::log_level l);
++# else
+ virtual
+ void log_entry_context(ostream& ostr, but::const_string value);
+
+ virtual
+ void entry_context_finish (ostream& ostr);
++# endif
+ #endif
+
+ private:
+@@ -2124,6 +2141,19 @@ void CNcbiBoostLogger::entry_context_sta
+ m_Upper->entry_context_start(ostr, l);
+ }
+
++# if BOOST_VERSION >= 106500
++void CNcbiBoostLogger::log_entry_context(ostream& ostr,
++ but::log_level l,
++ but::const_string value)
++{
++ m_Upper->log_entry_context(ostr, l, value);
++}
++
++void CNcbiBoostLogger::entry_context_finish(ostream& ostr, but::log_level l)
++{
++ m_Upper->entry_context_finish(ostr, l);
++}
++# else
+ void CNcbiBoostLogger::log_entry_context(ostream& ostr,
+ but::const_string value)
+ {
+@@ -2134,6 +2164,7 @@ void CNcbiBoostLogger::entry_context_fin
+ {
+ m_Upper->entry_context_finish(ostr);
+ }
++# endif
+ #endif
+
+ void
+@@ -2316,7 +2347,7 @@ main(int argc, char* argv[])
+
+ if (
+ #if BOOST_VERSION >= 106000
+- runtime_config::get<bool>( runtime_config::RESULT_CODE )
++ RTCFG(bool, RESULT_CODE, result_code)
+ #else
+ !runtime_config::no_result_code()
+ #endif