diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index dce1edb3b0a75fe5ca172e8c7d63b7ca25478951..22e678c7d6b910261b672709b39aa6145acb961f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -62,7 +62,7 @@ set (core_sources
      fiber.cc
      cbus.c
      exception.cc
-     coro.cc
+     coro.c
      reflection.c
      assoc.c
      rmean.c
diff --git a/src/coro.cc b/src/coro.c
similarity index 94%
rename from src/coro.cc
rename to src/coro.c
index 24dcd9632ae7b01c7e6fba0b89c9ea2d812f4e3b..1e1c783e11cb0d195804c4789ab7277c01acfe4c 100644
--- a/src/coro.cc
+++ b/src/coro.c
@@ -31,15 +31,14 @@
 #include "coro.h"
 
 #include "trivia/config.h"
-#include "exception.h"
 #include <unistd.h>
 #include <string.h>
 #include <sys/mman.h>
-
+#include "small/slab_cache.h"
 #include "third_party/valgrind/memcheck.h"
-#include "fiber.h"
 
-void
+
+int
 tarantool_coro_create(struct tarantool_coro *coro,
 		      struct slab_cache *slabc,
 		      void (*f) (void *), void *data)
@@ -54,14 +53,14 @@ tarantool_coro_create(struct tarantool_coro *coro,
 					+ slab_sizeof();
 
 	if (coro->stack == NULL) {
-		tnt_raise(OutOfMemory, sizeof(coro->stack_size),
-			  "mmap", "coro stack");
+		return -1;
 	}
 
 	(void) VALGRIND_STACK_REGISTER(coro->stack, (char *)
 				       coro->stack + coro->stack_size);
 
 	coro_create(&coro->ctx, f, data, coro->stack, coro->stack_size);
+	return 0;
 }
 
 void
diff --git a/src/coro.h b/src/coro.h
index 55b7f54198774850037d09f32eb6cec3cc09002c..dde3c03f9c4b39aba868fe9002d4323d406f5771 100644
--- a/src/coro.h
+++ b/src/coro.h
@@ -34,6 +34,10 @@
 
 #include <third_party/coro/coro.h>
 
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
 struct tarantool_coro {
 	coro_context ctx;
 	void *stack;
@@ -42,12 +46,15 @@ struct tarantool_coro {
 
 struct slab_cache;
 
-void
+int
 tarantool_coro_create(struct tarantool_coro *ctx,
 		      struct slab_cache *cache,
 		      void (*f) (void *), void *data);
 void
 tarantool_coro_destroy(struct tarantool_coro *ctx,
 		       struct slab_cache *cache);
+#if defined(__cplusplus)
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
 
 #endif /* TARANTOOL_CORO_H_INCLUDED */
diff --git a/src/exception.h b/src/exception.h
index c10e127e36aa9a094b6cb3b24811b74647d110fc..045f9eec88106492827e1c1f4141dd290a524ec3 100644
--- a/src/exception.h
+++ b/src/exception.h
@@ -122,8 +122,6 @@ class TimedOut: public SystemError {
 	virtual void raise() { throw this; }
 };
 
-/** \endcond */
-
 #define tnt_error(class, ...) ({					\
 	say_debug("%s at %s:%i", #class, __FILE__, __LINE__);		\
 	class *e = new class(__FILE__, __LINE__, ##__VA_ARGS__);	\
diff --git a/src/fiber.cc b/src/fiber.cc
index 102a28629834892c0d52fb76c231ce27661f5de8..3eb90638feced4640588e7b93773004641805c7f 100644
--- a/src/fiber.cc
+++ b/src/fiber.cc
@@ -156,7 +156,6 @@ fiber_wakeup(struct fiber *f)
  * in it. For cancellation to work, this exception type should be
  * re-raised whenever (if) it is caught.
  */
-
 void
 fiber_cancel(struct fiber *f)
 {
@@ -175,40 +174,10 @@ fiber_cancel(struct fiber *f)
 			fiber_wakeup(f);
 		fiber_yield();
 	}
-	/*
-	 * Check if we're ourselves cancelled.
-	 * This also implements cancel for the case when
-	 * f == fiber().
-	 */
-	fiber_testcancel();
-}
-
-bool
-fiber_is_cancelled()
-{
-	return fiber()->flags & FIBER_IS_CANCELLED;
 }
 
-/** Test if this fiber is in a cancellable state and was indeed
- * cancelled, and raise an exception (FiberCancelException) if
- * that's the case.
- */
-void
-fiber_testcancel(void)
-{
-	/*
-	 * Fiber can catch FiberCancelException using try..catch
-	 * block in C or pcall()/xpcall() in Lua. However,
-	 * FIBER_IS_CANCELLED flag is still set and the subject
-	 * fiber will be killed by subsequent unprotected call of
-	 * this function.
-	 */
-	if (fiber_is_cancelled())
-		tnt_raise(FiberCancelException);
-}
-
-
-/** Change the current cancellation state of a fiber. This is not
+/**
+ * Change the current cancellation state of a fiber. This is not
  * a cancellation point.
  */
 bool
@@ -252,6 +221,7 @@ fiber_join(struct fiber *fiber)
 		e->raise();
 	fiber_testcancel();
 }
+
 /**
  * @note: this is not a cancellation point (@sa fiber_testcancel())
  * but it is considered good practice to call testcancel()
@@ -525,8 +495,11 @@ fiber_new(const char *name, void (*f) (va_list))
 	} else {
 		fiber = (struct fiber *) mempool_alloc0(&cord->fiber_pool);
 
-		tarantool_coro_create(&fiber->coro, &cord->slabc,
-				      fiber_loop, NULL);
+		if (tarantool_coro_create(&fiber->coro, &cord->slabc,
+					  fiber_loop, NULL)) {
+			tnt_raise(OutOfMemory, 65536,
+				  "runtime arena", "coro stack");
+		}
 
 		region_create(&fiber->gc, &cord->slabc);
 
diff --git a/src/fiber.h b/src/fiber.h
index 5211503939b70bbaada298ceb4474ccbe935bae8..707f9196e59a2d6a8d26585ef48264a188b6cddd 100644
--- a/src/fiber.h
+++ b/src/fiber.h
@@ -306,13 +306,6 @@ fiber_find(uint32_t fid);
 void
 fiber_cancel(struct fiber *f);
 
-/**
- * Check if the current fiber has been cancelled.  Raises
- * tnt_FiberCancelException
- */
-void
-fiber_testcancel(void);
-
 /**
  * Make it possible or not possible to wakeup the current
  * fiber immediately when it's cancelled.
@@ -354,8 +347,12 @@ fiber_set_key(struct fiber *fiber, enum fiber_key key, void *value)
 	fiber->fls[key] = value;
 }
 
-bool
-fiber_is_cancelled();
+static inline bool
+fiber_is_cancelled()
+{
+	return fiber()->flags & FIBER_IS_CANCELLED;
+}
+
 
 static inline bool
 fiber_is_dead(struct fiber *f)
@@ -420,6 +417,26 @@ class FiberCancelException: public Exception {
 	}
 	virtual void raise() { throw this; }
 };
+
+/*
+ * Test if this fiber is in a cancellable state and was indeed
+ * cancelled, and raise an exception (FiberCancelException) if
+ * that's the case.
+ */
+static inline void
+fiber_testcancel(void)
+{
+	/*
+	 * Fiber can catch FiberCancelException using try..catch
+	 * block in C or pcall()/xpcall() in Lua. However,
+	 * FIBER_IS_CANCELLED flag is still set and the subject
+	 * fiber will be killed by subsequent unprotected call of
+	 * this function.
+	 */
+	if (fiber_is_cancelled())
+		tnt_raise(FiberCancelException);
+}
+
 #endif /* defined(__cplusplus) */
 
 #endif /* TARANTOOL_FIBER_H_INCLUDED */
diff --git a/src/lua/fiber.cc b/src/lua/fiber.cc
index 4c4fe8020ca8f381c97d5027fcdc97b73433510b..0645f2b1ec7fee549cc6185bf35cd926434eafbe 100644
--- a/src/lua/fiber.cc
+++ b/src/lua/fiber.cc
@@ -479,6 +479,12 @@ lbox_fiber_cancel(struct lua_State *L)
 {
 	struct fiber *f = lbox_checkfiber(L, 1);
 	fiber_cancel(f);
+	/*
+	 * Check if we're ourselves cancelled.
+	 * This also implements cancel for the case when
+	 * f == fiber().
+	 */
+	fiber_testcancel();
 	return 0;
 }
 
@@ -493,6 +499,8 @@ lbox_fiber_kill(struct lua_State *L)
 	if (f == NULL)
 		luaL_error(L, "fiber.kill(): fiber not found");
 	fiber_cancel(f);
+	/* Check if we're ourselves cancelled. */
+	fiber_testcancel();
 	return 0;
 }