diff --git a/src/box/box.cc b/src/box/box.cc
index 3c25883d7124213b474556487e7b80e8e780762e..7b182c57c71281c6dac35bdd3ef7fa9f43cfa24f 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -87,7 +87,7 @@ static struct recover_row_ctx {
 bool snapshot_in_progress = false;
 static bool box_init_done = false;
 bool is_ro = true;
-struct ipc_channel *wait_rw;
+struct ipc_channel wait_rw;
 
 void
 recover_row_ctx_init(struct recover_row_ctx *ctx, size_t rows_per_wal)
@@ -177,8 +177,8 @@ void
 box_set_ro(bool ro)
 {
 	is_ro = ro;
-	if (ro == false && !ipc_channel_is_full(wait_rw))
-		ipc_channel_put(wait_rw, NULL);
+	if (ro == false && ipc_channel_has_readers(&wait_rw))
+		ipc_channel_put(&wait_rw, NULL);
 }
 
 static void
@@ -186,7 +186,7 @@ box_wait_rw()
 {
 	void *msg;
 	while (is_ro) {
-		ipc_channel_get(wait_rw, &msg);
+		ipc_channel_get(&wait_rw, &msg);
 		assert(msg == NULL);
 	}
 }
@@ -952,9 +952,8 @@ box_free(void)
 		port_free();
 #endif
 		engine_shutdown();
+		ipc_channel_destroy(&wait_rw);
 	}
-	if (wait_rw)
-		ipc_channel_delete(wait_rw);
 }
 
 static void
@@ -1001,9 +1000,7 @@ box_init(void)
 {
 	error_init();
 
-	wait_rw = ipc_channel_new(1);
-	if (wait_rw == NULL)
-		diag_raise();
+	ipc_channel_create(&wait_rw, 0);
 
 	tuple_init(cfg_getd("slab_alloc_arena"),
 		   cfg_geti("slab_alloc_minimal"),
@@ -1037,7 +1034,6 @@ box_init(void)
 	recovery_setup_panic(recovery,
 			     cfg_geti("panic_on_snap_error"),
 			     cfg_geti("panic_on_wal_error"));
-	box_set_too_long_threshold();
 
 	/*
 	 * Initialize the cluster registry using replication_source,