diff --git a/debian/control b/debian/control
index 01285666fee7ea65adb0969fb1a9fe0a14de75d2..71632d85a56ab52e16d631bccbfdc1743ff3f6c9 100644
--- a/debian/control
+++ b/debian/control
@@ -20,6 +20,7 @@ Conflicts: tarantool-common (<< 1.5.3),
  tarantool-lts-common,
  tarantool-lts,
  tarantool-lts-modules,
+ tarantool-lts-client,
  tarantool-lts-postgresql-module,
  tarantool-lts-mysql-module,
  tarantool-lts-dev,
@@ -49,6 +50,7 @@ Conflicts: tarantool-lts-common,
  tarantool-lts-postgresql-module,
  tarantool-lts-mysql-module,
  tarantool-lts-dev,
+ tarantool-lts-client,
  tarantool-dbg (<< 1.5.2),
  tarantool-common (<< 1.6~),
  tarantool-client (<< 1.6~),
@@ -83,6 +85,7 @@ Conflicts: tarantool-lts-common,
  tarantool-lts-modules,
  tarantool-lts-postgresql-module,
  tarantool-lts-mysql-module,
+ tarantool-lts-client,
  tarantool-lts-dev,
  tarantool-dbg (<< 1.5.2),
  tarantool-common (<< 1.6~),
diff --git a/doc/www/content/newsite/download.yml.in b/doc/www/content/newsite/download.yml.in
index d0019a454549b3baf6f2bb845b08dd6fd205e306..d9bdd48ed82543fd47823a51550138ad4490d207 100644
--- a/doc/www/content/newsite/download.yml.in
+++ b/doc/www/content/newsite/download.yml.in
@@ -22,7 +22,7 @@ blocks :
           `<http://tarantool.org/dist/master/ubuntu>`_.
 
           At the moment the repository contains builds for Ubuntu
-          "Precise", "Trusty", "Saucy". It can be added to your
+          "Precise", "Trusty", "Saucy", "Vivid". It can be added to your
           apt sources list with:
 
           .. code-block:: bash
@@ -76,7 +76,7 @@ blocks :
           from `Apple Developer`_ web-site.
 
           .. _Apple Developer: https://developer.apple.com/downloads/
-    - - "Fedora 19, 20 and Rawhide"
+    - - "Fedora 19, 20, 21, 22"
       - format : rst
         content: |
           Fedora repository is available at
diff --git a/doc/www/content/newsite/index.yml b/doc/www/content/newsite/index.yml
index f396d11c27d354fc1cc1d57e0eaaca5128422381..83fcd48238e3517e65fb5a51d7a9670bb495e311 100644
--- a/doc/www/content/newsite/index.yml
+++ b/doc/www/content/newsite/index.yml
@@ -6,7 +6,7 @@ template: "index"
 blocks  :
   header:
     - "Tarantool"
-    - "Get your data in RAM. Get compute close to data. Enjoy the performance"
+    - "Get your data in RAM. Get compute close to data. Enjoy the performance."
   features:
     - format: rst
       content: >
diff --git a/extra/rpm/mock/tarantool-fedora-21-i386.cfg b/extra/rpm/mock/tarantool-fedora-21-i386.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..5d77d87cb0e5323a1439e2557542716740c120a5
--- /dev/null
+++ b/extra/rpm/mock/tarantool-fedora-21-i386.cfg
@@ -0,0 +1,68 @@
+config_opts['root'] = 'fedora-21-i386'
+config_opts['target_arch'] = 'i386'
+config_opts['legal_host_arches'] = ('i386', 'i586', 'i686', 'x86_64')
+config_opts['chroot_setup_cmd'] = 'install @buildsys-build'
+config_opts['dist'] = 'fc21'  # only useful for --resultdir variable subst
+config_opts['extra_chroot_dirs'] = [ '/run/lock', ]
+config_opts['releasever'] = '21'
+
+config_opts['yum.conf'] = """
+[main]
+cachedir=/var/cache/yum
+keepcache=1
+debuglevel=2
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+syslog_ident=mock
+syslog_device=
+
+# repos
+
+[fedora]
+name=fedora
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-21-primary
+gpgcheck=1
+
+[updates]
+name=updates
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-21-primary
+gpgcheck=1
+
+[updates-testing]
+name=updates-testing
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+
+[local]
+name=local
+baseurl=http://kojipkgs.fedoraproject.org/repos/f21-build/latest/i386/
+cost=2000
+enabled=0
+
+[fedora-debuginfo]
+name=fedora-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+
+[updates-debuginfo]
+name=updates-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+
+[updates-testing-debuginfo]
+name=updates-testing-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+"""
diff --git a/extra/rpm/mock/tarantool-fedora-21-x86_64.cfg b/extra/rpm/mock/tarantool-fedora-21-x86_64.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..ac48a3212d8381d0eccde2e8f43ddff2ed2e7e2c
--- /dev/null
+++ b/extra/rpm/mock/tarantool-fedora-21-x86_64.cfg
@@ -0,0 +1,68 @@
+config_opts['root'] = 'fedora-21-x86_64'
+config_opts['target_arch'] = 'x86_64'
+config_opts['legal_host_arches'] = ('x86_64',)
+config_opts['chroot_setup_cmd'] = 'install @buildsys-build'
+config_opts['dist'] = 'fc21'  # only useful for --resultdir variable subst
+config_opts['extra_chroot_dirs'] = [ '/run/lock', ]
+config_opts['releasever'] = '21'
+
+config_opts['yum.conf'] = """
+[main]
+cachedir=/var/cache/yum
+keepcache=1
+debuglevel=2
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+syslog_ident=mock
+syslog_device=
+
+# repos
+
+[fedora]
+name=fedora
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-21-primary
+gpgcheck=1
+
+[updates]
+name=updates
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-21-primary
+gpgcheck=1
+
+[updates-testing]
+name=updates-testing
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+
+[local]
+name=local
+baseurl=http://kojipkgs.fedoraproject.org/repos/f21-build/latest/x86_64/
+cost=2000
+enabled=0
+
+[fedora-debuginfo]
+name=fedora-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+
+[updates-debuginfo]
+name=updates-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+
+[updates-testing-debuginfo]
+name=updates-testing-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+"""
diff --git a/extra/rpm/mock/tarantool-fedora-22-i386.cfg b/extra/rpm/mock/tarantool-fedora-22-i386.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..513106374b00a8f0bc889ec1463309defa75fa29
--- /dev/null
+++ b/extra/rpm/mock/tarantool-fedora-22-i386.cfg
@@ -0,0 +1,60 @@
+
+config_opts['root'] = 'fedora-22-i386'
+config_opts['target_arch'] = 'i386'
+config_opts['legal_host_arches'] = ('i386', 'i586', 'i686', 'x86_64')
+config_opts['chroot_setup_cmd'] = 'install @buildsys-build'
+config_opts['dist'] = 'fc22'  # only useful for --resultdir variable subst
+config_opts['extra_chroot_dirs'] = [ '/run/lock', ]
+config_opts['releasever'] = '22'
+
+config_opts['yum.conf'] = """
+[main]
+keepcache=1
+debuglevel=2
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+syslog_ident=mock
+syslog_device=
+# repos
+[fedora]
+name=fedora
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-22-primary
+gpgcheck=1
+[updates]
+name=updates
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-22-primary
+gpgcheck=1
+[updates-testing]
+name=updates-testing
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+[local]
+name=local
+baseurl=http://kojipkgs.fedoraproject.org/repos/f22-build/latest/i386/
+cost=2000
+enabled=0
+[fedora-debuginfo]
+name=fedora-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+[updates-debuginfo]
+name=updates-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+[updates-testing-debuginfo]
+name=updates-testing-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+"""
diff --git a/extra/rpm/mock/tarantool-fedora-22-x86_64.cfg b/extra/rpm/mock/tarantool-fedora-22-x86_64.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..80796d5bfabbd7e49d8b7d413927545731886694
--- /dev/null
+++ b/extra/rpm/mock/tarantool-fedora-22-x86_64.cfg
@@ -0,0 +1,60 @@
+
+config_opts['root'] = 'fedora-22-x86_64'
+config_opts['target_arch'] = 'x86_64'
+config_opts['legal_host_arches'] = ('x86_64',)
+config_opts['chroot_setup_cmd'] = 'install @buildsys-build'
+config_opts['dist'] = 'fc22'  # only useful for --resultdir variable subst
+config_opts['extra_chroot_dirs'] = [ '/run/lock', ]
+config_opts['releasever'] = '22'
+
+config_opts['yum.conf'] = """
+[main]
+keepcache=1
+debuglevel=2
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+syslog_ident=mock
+syslog_device=
+# repos
+[fedora]
+name=fedora
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-22-primary
+gpgcheck=1
+[updates]
+name=updates
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
+failovermethod=priority
+gpgkey=file:///etc/pki/mock/RPM-GPG-KEY-fedora-22-primary
+gpgcheck=1
+[updates-testing]
+name=updates-testing
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+[local]
+name=local
+baseurl=http://kojipkgs.fedoraproject.org/repos/f22-build/latest/x86_64/
+cost=2000
+enabled=0
+[fedora-debuginfo]
+name=fedora-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+[updates-debuginfo]
+name=updates-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+[updates-testing-debuginfo]
+name=updates-testing-debuginfo
+metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f$releasever&arch=$basearch
+failovermethod=priority
+enabled=0
+"""
diff --git a/src/box/box.cc b/src/box/box.cc
index 6c63519e279aaf037e8604bb2ecbd7fdad9befc8..9f872196dfeb4872bf57d62bee555c34108be49d 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -114,6 +114,12 @@ box_check_uri(const char *source, const char *option_name)
 	}
 }
 
+static void
+box_check_replication_source(void)
+{
+	box_check_uri(cfg_gets("replication_source"), "replication_source");
+}
+
 static enum wal_mode
 box_check_wal_mode(const char *mode_name)
 {
@@ -150,16 +156,16 @@ box_check_config()
 {
 	box_check_wal_mode(cfg_gets("wal_mode"));
 	box_check_uri(cfg_gets("listen"), "listen");
-	box_check_uri(cfg_gets("replication_source"), "replication_source");
+	box_check_replication_source();
 	box_check_readahead(cfg_geti("readahead"));
 	box_check_rows_per_wal(cfg_geti("rows_per_wal"));
 	box_check_wal_mode(cfg_gets("wal_mode"));
 }
 
 extern "C" void
-box_set_replication_source(const char *source)
+box_set_replication_source(void)
 {
-	box_check_uri(source, "replication_source");
+	const char *source = cfg_gets("replication_source");
 	bool old_is_replica = recovery->remote.reader;
 	bool new_is_replica = source != NULL;
 
@@ -187,15 +193,17 @@ box_set_replication_source(const char *source)
 }
 
 extern "C" void
-box_set_listen(const char *uri)
+box_set_listen(void)
 {
+	const char *uri = cfg_gets("listen");
 	box_check_uri(uri, "listen");
 	iproto_set_listen(uri);
 }
 
 extern "C" void
-box_set_wal_mode(const char *mode_name)
+box_set_wal_mode(void)
 {
+	const char *mode_name = cfg_gets("wal_mode");
 	enum wal_mode mode = box_check_wal_mode(mode_name);
 	if (mode != recovery->wal_mode &&
 	    (mode == WAL_FSYNC || recovery->wal_mode == WAL_FSYNC)) {
@@ -211,38 +219,39 @@ box_set_wal_mode(const char *mode_name)
 }
 
 extern "C" void
-box_set_log_level(int level)
+box_set_log_level(void)
 {
-	say_set_log_level(level);
+	say_set_log_level(cfg_geti("log_level"));
 }
 
 extern "C" void
-box_set_io_collect_interval(double interval)
+box_set_io_collect_interval(void)
 {
-	ev_set_io_collect_interval(loop(), interval);
+	ev_set_io_collect_interval(loop(), cfg_getd("io_collect_interval"));
 }
 
 extern "C" void
-box_set_snap_io_rate_limit(double limit)
+box_set_snap_io_rate_limit(void)
 {
-	recovery_update_io_rate_limit(recovery, limit);
+	recovery_update_io_rate_limit(recovery, cfg_getd("snap_io_rate_limit"));
 }
 
 extern "C" void
-box_set_too_long_threshold(double threshold)
+box_set_too_long_threshold(void)
 {
-	too_long_threshold = threshold;
+	too_long_threshold = cfg_getd("too_long_threshold");
 }
 
 extern "C" void
-box_set_readahead(int readahead)
+box_set_readahead(void)
 {
+	int readahead = cfg_geti("readahead");
 	box_check_readahead(readahead);
 	iobuf_set_readahead(readahead);
 }
 
 extern "C" void
-box_set_panic_on_wal_error(int /* yesno */)
+box_set_panic_on_wal_error(void)
 {
 	recovery_setup_panic(recovery,
 			     cfg_geti("panic_on_snap_error"),
@@ -627,11 +636,12 @@ box_init(void)
 				cfg_gets("wal_dir"),
 				recover_row, NULL);
 	recovery_set_remote(recovery,
-			    cfg_gets("replication_source"));
+		cfg_gets("replication_source"));
 	recovery_setup_panic(recovery,
 			     cfg_geti("panic_on_snap_error"),
 			     cfg_geti("panic_on_wal_error"));
 
+
 	if (recovery_has_data(recovery)) {
 		/* Tell Sophia engine LSN it must recover to. */
 		int64_t checkpoint_id =
@@ -660,7 +670,7 @@ box_init(void)
 
 	port_init();
 	iproto_init();
-	box_set_listen(cfg_gets("listen"));
+	box_set_listen();
 
 	int rows_per_wal = box_check_rows_per_wal(cfg_geti("rows_per_wal"));
 	enum wal_mode wal_mode = box_check_wal_mode(cfg_gets("wal_mode"));
diff --git a/src/box/box.h b/src/box/box.h
index 6ea05d50e1c6946ad252b82dcc668135b7a0fdb1..3ca093176c1f0b6d57c2d033a47cdcf8a4df493c 100644
--- a/src/box/box.h
+++ b/src/box/box.h
@@ -102,14 +102,14 @@ box_process_subscribe(int fd, struct xrow_header *header);
 void
 box_check_config();
 
-void box_set_listen(const char *uri);
-void box_set_replication_source(const char *source);
-void box_set_wal_mode(const char *mode);
-void box_set_log_level(int level);
-void box_set_io_collect_interval(double interval);
-void box_set_snap_io_rate_limit(double limit);
-void box_set_too_long_threshold(double threshold);
-void box_set_readahead(int readahead);
+void box_set_listen(void);
+void box_set_replication_source(void);
+void box_set_wal_mode(void);
+void box_set_log_level(void);
+void box_set_io_collect_interval(void);
+void box_set_snap_io_rate_limit(void);
+void box_set_too_long_threshold(void);
+void box_set_readahead(void);
 
 extern struct recovery_state *recovery;
 
diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua
index e62f8a4abccaa069338ca8af200c048fa3a72d1e..3bec896c17d782171c90df155680ca133f928b81 100644
--- a/src/box/lua/load_cfg.lua
+++ b/src/box/lua/load_cfg.lua
@@ -4,18 +4,19 @@ local ffi = require('ffi')
 ffi.cdef([[
 void check_cfg();
 void load_cfg();
-void box_set_wal_mode(const char *mode);
-void box_set_listen(const char *uri);
-void box_set_replication_source(const char *source);
-void box_set_log_level(int level);
-void box_set_readahead(int readahead);
-void box_set_io_collect_interval(double interval);
-void box_set_too_long_threshold(double threshold);
-void box_set_snap_io_rate_limit(double limit);
-void box_set_panic_on_wal_error(int);
+void box_set_wal_mode(void);
+void box_set_listen(void);
+void box_set_replication_source(void);
+void box_set_log_level(void);
+void box_set_readahead(void);
+void box_set_io_collect_interval(void);
+void box_set_too_long_threshold(void);
+void box_set_snap_io_rate_limit(void);
+void box_set_panic_on_wal_error(void);
 ]])
 
 local log = require('log')
+local json = require('json')
 
 -- see default_cfg below
 local default_sophia_cfg = {
@@ -215,10 +216,15 @@ local function reload_cfg(oldcfg, cfg)
     end
     for key in pairs(cfg) do
         local val = newcfg[key]
-        if oldcfg[key] ~= val then
-            dynamic_cfg[key](val)
+        local oldval = oldcfg[key]
+        if oldval ~= val then
             rawset(oldcfg, key, val)
-            log.info("set '%s' configuration option to '%s'", key, val)
+            if not pcall(dynamic_cfg[key]) then
+                rawset(oldcfg, key, oldval) -- revert the old value
+                return box.error() -- re-throw
+            end
+            log.info("set '%s' configuration option to %s", key,
+                json.encode(val))
         end
     end
     if type(box.on_reload_configuration) == 'function' then
@@ -270,9 +276,9 @@ local function load_cfg(cfg)
     for key, fun in pairs(dynamic_cfg) do
         local val = cfg[key]
         if val ~= nil and not dynamic_cfg_skip_at_load[key] then
-            fun(cfg[key])
+            fun()
             if val ~= default_cfg[key] then
-                log.info("set '%s' configuration option to '%s'", key, val)
+                log.info("set '%s' configuration option to %s", key, json.encode(val))
             end
         end
     end
diff --git a/src/box/lua/snapshot_daemon.lua b/src/box/lua/snapshot_daemon.lua
index c7a2c410da7d108e7e388903b8236d1a0e47384a..7551839adcdb2949f3cc3edcdffff0ce53d2ff62 100644
--- a/src/box/lua/snapshot_daemon.lua
+++ b/src/box/lua/snapshot_daemon.lua
@@ -219,18 +219,18 @@ do
 
     setmetatable(daemon, {
         __index = {
-            set_snapshot_period = function(snapshot_period)
-                daemon.snapshot_period = snapshot_period
+            set_snapshot_period = function()
+                daemon.snapshot_period = box.cfg.snapshot_period
                 reload(daemon)
                 return
             end,
 
-            set_snapshot_count = function(snapshot_count)
-                if math.floor(snapshot_count) ~= snapshot_count then
+            set_snapshot_count = function()
+                if math.floor(box.cfg.snapshot_count) ~= box.cfg.snapshot_count then
                     box.error(box.error.CFG, "snapshot_count",
                              "must be an integer")
                 end
-                daemon.snapshot_count = snapshot_count
+                daemon.snapshot_count = box.cfg.snapshot_count
                 reload(daemon)
            end
         }
diff --git a/src/box/relay.cc b/src/box/relay.cc
index ae851e5d2bf210ae9d7c2d3f64ea9285ddd27778..a5beec36ba59d80ad77e04c295715b5aa0e61a73 100644
--- a/src/box/relay.cc
+++ b/src/box/relay.cc
@@ -30,7 +30,6 @@
  */
 #include "relay.h"
 #include <say.h>
-#include <fiber.h>
 #include "scoped_guard.h"
 
 #include "recovery.h"
@@ -103,9 +102,8 @@ replication_join(int fd, struct xrow_header *packet,
 	struct tt_uuid server_uuid = uuid_nil;
 	xrow_decode_join(packet, &server_uuid);
 
-	struct cord cord;
-	cord_costart(&cord, "join", replication_join_f, &relay);
-	cord_cojoin(&cord);
+	cord_costart(&relay.cord, "join", replication_join_f, &relay);
+	cord_cojoin(&relay.cord);
 	/**
 	 * Call the server-side hook which stores the replica uuid
 	 * in _cluster hook after sending the last row but before
diff --git a/src/box/relay.h b/src/box/relay.h
index 29c1ae114d68ae52a0063ef1868aa1304dcef4ef..8f50f81247414db17ca44bfeb5da1fa7aba694c6 100644
--- a/src/box/relay.h
+++ b/src/box/relay.h
@@ -31,12 +31,15 @@
  * SUCH DAMAGE.
  */
 #include "evio.h"
+#include "fiber.h"
 
 struct xrow_header;
 
 /** State of a replication relay. */
 class Relay {
 public:
+	/** The thread in which we relay data to the replica. */
+	struct cord cord;
 	/** Replica connection */
 	struct ev_io io;
 	/* Request sync */
diff --git a/src/lua/log.lua b/src/lua/log.lua
index d086bcc6dfb7b0c18c6dc8030e851d99f7bc9710..02f9303d9085cd6bc0cd4b643db450a57d832049 100644
--- a/src/lua/log.lua
+++ b/src/lua/log.lua
@@ -4,6 +4,8 @@ local ffi = require('ffi')
 ffi.cdef[[
     typedef void (*sayfunc_t)(int level, const char *filename, int line,
                const char *error, const char *format, ...);
+    void
+    say_set_log_level(int new_level);
 
     extern sayfunc_t _say;
     extern void say_logrotate(int);
@@ -70,5 +72,9 @@ return {
 
     logger_pid = function()
         return tonumber(ffi.C.logger_pid)
-    end
+    end,
+
+    level = function(level)
+        return ffi.C.say_set_log_level(level)
+    end,
 }
diff --git a/test/app/console.test.lua b/test/app/console.test.lua
index ad99b7c11928eb34d3ef09fcbfb20ed011ac65f4..212b5e13ed0581e59641230ed5296b643d09292d 100755
--- a/test/app/console.test.lua
+++ b/test/app/console.test.lua
@@ -6,9 +6,10 @@ local socket = require('socket')
 local yaml = require('yaml')
 local fiber = require('fiber')
 local ffi = require('ffi')
+local log = require('log')
 
 -- Supress console log messages
-ffi.C.box_set_log_level(4)
+log.level(4)
 
 local CONSOLE_SOCKET = '/tmp/tarantool-test-console.sock'
 local IPROTO_SOCKET = '/tmp/tarantool-test-iproto.sock'
diff --git a/test/box/cfg.result b/test/box/cfg.result
index 937a4bfe27939c570c7a07d9c45afe70fc91f83f..5269212912bf4b0cc28db18fef755ee6c0053382 100644
--- a/test/box/cfg.result
+++ b/test/box/cfg.result
@@ -2,7 +2,7 @@
 --# push filter 'admin: .*' to 'admin: <uri>'
 box.cfg.nosuchoption = 1
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:265: Attempt to modify a read-only
+- error: '[string "-- load_cfg.lua - internal file..."]:271: Attempt to modify a read-only
     table'
 ...
 cfg_filter(box.cfg)
@@ -34,7 +34,7 @@ cfg_filter(box.cfg)
 -- must be read-only
 box.cfg()
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:211: bad argument #1 to ''pairs''
+- error: '[string "-- load_cfg.lua - internal file..."]:212: bad argument #1 to ''pairs''
     (table expected, got nil)'
 ...
 cfg_filter(box.cfg)
@@ -66,23 +66,23 @@ cfg_filter(box.cfg)
 -- check that cfg with unexpected parameter fails.
 box.cfg{sherlock = 'holmes'}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:167: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:168: Error: cfg parameter
     ''sherlock'' is unexpected'
 ...
 -- check that cfg with unexpected type of parameter failes
 box.cfg{listen = {}}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:187: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:188: Error: cfg parameter
     ''listen'' should be one of types: string, number'
 ...
 box.cfg{wal_dir = 0}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:181: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:182: Error: cfg parameter
     ''wal_dir'' should be of type string'
 ...
 box.cfg{coredump = 'true'}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:181: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:182: Error: cfg parameter
     ''coredump'' should be of type boolean'
 ...
 --------------------------------------------------------------------------------
@@ -90,17 +90,17 @@ box.cfg{coredump = 'true'}
 --------------------------------------------------------------------------------
 box.cfg{slab_alloc_arena = "100500"}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:181: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:182: Error: cfg parameter
     ''slab_alloc_arena'' should be of type number'
 ...
 box.cfg{sophia = "sophia"}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:175: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:176: Error: cfg parameter
     ''sophia'' should be a table'
 ...
 box.cfg{sophia = {threads = "threads"}}
 ---
-- error: '[string "-- load_cfg.lua - internal file..."]:181: Error: cfg parameter
+- error: '[string "-- load_cfg.lua - internal file..."]:182: Error: cfg parameter
     ''sophia.threads'' should be of type number'
 ...
 --------------------------------------------------------------------------------