diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c
index f7816d780c7c7159319598eb48330e8a845ab694..9e5a6b93efc20cec93eca42b4249d12ad53336f8 100644
--- a/src/lib/core/fiber.c
+++ b/src/lib/core/fiber.c
@@ -1240,7 +1240,6 @@ fiber_new_ex(const char *name, const struct fiber_attr *fiber_attr,
 					  struct fiber, link);
 		rlist_move_entry(&cord->alive, fiber, link);
 		assert((fiber->flags | FIBER_IS_DEAD) != 0);
-		fiber->flags = FIBER_DEFAULT_FLAGS;
 	} else {
 		fiber = (struct fiber *)
 			mempool_alloc(&cord->fiber_mempool);
@@ -1265,11 +1264,10 @@ fiber_new_ex(const char *name, const struct fiber_attr *fiber_attr,
 		rlist_create(&fiber->wake);
 		diag_create(&fiber->diag);
 		fiber_reset(fiber);
-		fiber->flags = fiber_attr->flags;
 
 		rlist_add_entry(&cord->alive, fiber, link);
 	}
-
+	fiber->flags = fiber_attr->flags;
 	fiber->f = f;
 	/* Excluding reserved range */
 	if (++cord->max_fid < FIBER_ID_MAX_RESERVED)
diff --git a/test/unit/fiber.cc b/test/unit/fiber.cc
index 9d21840dd1f646f04c9b7ec1e9ae01a4e233f9d6..211a1e8343a8e13c77a91f9a9c478eb3046b0692 100644
--- a/test/unit/fiber.cc
+++ b/test/unit/fiber.cc
@@ -37,6 +37,14 @@ cancel_f(va_list ap)
 	return 0;
 }
 
+static int
+wait_cancel_f(va_list ap)
+{
+	while (!fiber_is_cancelled())
+		fiber_yield();
+	return 0;
+}
+
 static int
 exception_f(va_list ap)
 {
@@ -261,6 +269,29 @@ fiber_dead_while_in_cache_test(void)
 	footer();
 }
 
+static void
+fiber_flags_respect_test(void)
+{
+	header();
+
+	/* Make sure the cache has at least one fiber. */
+	struct fiber *f = fiber_new_xc("nop", noop_f);
+	fiber_start(f);
+
+	/* Fibers taken from the cache need to respect the passed flags. */
+	struct fiber_attr attr;
+	fiber_attr_create(&attr);
+	uint32_t flags = FIBER_IS_JOINABLE | FIBER_IS_CANCELLABLE;
+	attr.flags |= flags;
+	f = fiber_new_ex("wait_cancel", &attr, wait_cancel_f);
+	fail_unless((f->flags & flags) == flags);
+	fiber_wakeup(f);
+	fiber_cancel(f);
+	fiber_join(f);
+
+	footer();
+}
+
 static int
 main_f(va_list ap)
 {
@@ -269,6 +300,7 @@ main_f(va_list ap)
 	fiber_stack_test();
 	fiber_wakeup_self_test();
 	fiber_dead_while_in_cache_test();
+	fiber_flags_respect_test();
 	ev_break(loop(), EVBREAK_ALL);
 	return 0;
 }
diff --git a/test/unit/fiber.result b/test/unit/fiber.result
index 8234bf0e5485f5b3ada117de8dba4c143c39e879..61ff54529c4c8db88f6dd3263cf7d30fc0a52983 100644
--- a/test/unit/fiber.result
+++ b/test/unit/fiber.result
@@ -21,3 +21,5 @@ SystemError Failed to allocate 42 bytes in allocator for exception: Cannot alloc
 	*** fiber_wakeup_self_test: done ***
 	*** fiber_dead_while_in_cache_test ***
 	*** fiber_dead_while_in_cache_test: done ***
+	*** fiber_flags_respect_test ***
+	*** fiber_flags_respect_test: done ***