diff --git a/core/fiber.m b/core/fiber.m
index 9d23203c8ab58a7b861f3ab61cedb4d35cb55ecd..1e86df88ced53a4ae06d267b1ab04ba77fed5dc0 100644
--- a/core/fiber.m
+++ b/core/fiber.m
@@ -281,7 +281,6 @@ void
 fiber_gc(void)
 {
 	struct palloc_pool *tmp;
-	const char *tmp_name;
 
 	fiber_cleanup();
 
@@ -291,9 +290,8 @@ fiber_gc(void)
 	tmp = fiber->pool;
 	fiber->pool = ex_pool;
 	ex_pool = tmp;
-	tmp_name = palloc_name(fiber->pool, NULL);
-	palloc_name(fiber->pool, palloc_name(ex_pool, NULL));
-	palloc_name(ex_pool, tmp_name);
+	palloc_set_name(fiber->pool, fiber->name);
+	palloc_set_name(ex_pool, "ex_pool");
 
 	fiber->rbuf = tbuf_clone(fiber->pool, fiber->rbuf);
 	fiber->cleanup = tbuf_clone(fiber->pool, fiber->cleanup);
@@ -327,7 +325,7 @@ static void
 fiber_zombificate()
 {
 	diag_clear();
-	fiber->name = NULL;
+	fiber_set_name(fiber, "zombie");
 	fiber->f = NULL;
 	fiber->data = NULL;
 	unregister_fid(fiber);
@@ -367,9 +365,20 @@ fiber_loop(void *data __attribute__((unused)))
 }
 
 
+/** Set fiber name. 
+* @Param[in] name the new name of the fiber. Truncated to FIBER_NAME_MAXLEN.
+*/
+
+void
+fiber_set_name(struct fiber *fiber, const char *name)
+{
+	assert(name != NULL);
+	snprintf(fiber->name, sizeof(fiber->name), "%s", name);
+}
+
 /* fiber never dies, just become zombie */
 struct fiber *
-fiber_create(const char *restrict name, int fd, int inbox_size, void (*f) (void *), void *f_data)
+fiber_create(const char *name, int fd, int inbox_size, void (*f) (void *), void *f_data)
 {
 	struct fiber *fiber = NULL;
 	if (inbox_size <= 0)
@@ -387,7 +396,7 @@ fiber_create(const char *restrict name, int fd, int inbox_size, void (*f) (void
 		if (tarantool_coro_create(&fiber->coro, fiber_loop, NULL) == NULL)
 			return NULL;
 
-		fiber->pool = palloc_create_pool(fiber->name);
+		fiber->pool = palloc_create_pool(name);
 		fiber->inbox = palloc(eter_pool, (sizeof(*fiber->inbox) +
 						  inbox_size * sizeof(struct tbuf *)));
 		fiber->inbox->size = inbox_size;
@@ -401,14 +410,14 @@ fiber_create(const char *restrict name, int fd, int inbox_size, void (*f) (void
 		SLIST_INSERT_HEAD(&fibers, fiber, link);
 	}
 
-	fiber->name = name;
-	palloc_name(fiber->pool, name);
 	fiber->fd = fd;
 	fiber->f = f;
 	fiber->f_data = f_data;
 	while (++last_used_fid <= 100) ;	/* fids from 0 to 100 are reserved */
 	fiber->fid = last_used_fid;
 	fiber->flags = 0;
+	fiber_set_name(fiber, name);
+	palloc_set_name(fiber->pool, fiber->name);
 	register_fid(fiber);
 
 	return fiber;
@@ -881,7 +890,7 @@ struct child *
 spawn_child(const char *name, int inbox_size, struct tbuf *(*handler) (void *, struct tbuf *),
 	    void *state)
 {
-	char *proxy_name, *child_name;
+	char *proxy_name;
 	int socks[2];
 	int pid;
 
@@ -913,11 +922,12 @@ spawn_child(const char *name, int inbox_size, struct tbuf *(*handler) (void *, s
 		c->out->flags |= FIBER_READING_INBOX;
 		return c;
 	} else {
+		char child_name[sizeof(fiber->name)];
+
 		salloc_destroy();
 		close_all_xcpt(2, socks[0], sayfd);
-		child_name = palloc(eter_pool, 64);
-		snprintf(child_name, 64, "%s/child", name);
-		sched.name = child_name;
+		snprintf(child_name, sizeof(child_name), "%s/child", name);
+		fiber_set_name(&sched, child_name);
 		set_proc_title(name);
 		say_crit("%s initialized", name);
 		blocking_loop(socks[0], handler, state);
@@ -1150,7 +1160,7 @@ fiber_init(void)
 
 	memset(&sched, 0, sizeof(sched));
 	sched.fid = 1;
-	sched.name = "sched";
+	fiber_set_name(&sched, "sched");
 	sched.pool = palloc_create_pool(sched.name);
 
 	sp = call_stack;
diff --git a/core/palloc.m b/core/palloc.m
index b1b0e1ea9b6c076fa22479efcbb77784eac5ebe2..a8f7eb4409ab8c2f52c2ad8cf475819090b21f12 100644
--- a/core/palloc.m
+++ b/core/palloc.m
@@ -39,6 +39,8 @@
 #include <third_party/queue.h>
 #include <tbuf.h>
 
+#define PALLOC_POOL_NAME_MAXLEN 16
+
 struct chunk {
 	uint32_t magic;
 	void *brk;
@@ -66,7 +68,7 @@ struct palloc_pool {
 	struct chunk_list_head chunks;
 	 SLIST_ENTRY(palloc_pool) link;
 	size_t allocated;
-	const char *name;
+	char name[PALLOC_POOL_NAME_MAXLEN];
 };
 
 SLIST_HEAD(palloc_pool_head, palloc_pool) pools;
@@ -312,7 +314,7 @@ palloc_create_pool(const char *name)
 	struct palloc_pool *pool = malloc(sizeof(struct palloc_pool));
 	assert(pool != NULL);
 	memset(pool, 0, sizeof(*pool));
-	pool->name = name;
+	palloc_set_name(pool, name);
 	SLIST_INIT(&pool->chunks);
 	SLIST_INSERT_HEAD(&pools, pool, link);
 	VALGRIND_CREATE_MEMPOOL(pool, PALLOC_REDZONE, 0);
@@ -390,13 +392,11 @@ palloc_stat(struct tbuf *buf)
 	}
 }
 
-const char *
-palloc_name(struct palloc_pool *pool, const char *new_name)
+void
+palloc_set_name(struct palloc_pool *pool, const char *name)
 {
-	const char *old_name = pool->name;
-	if (new_name != NULL)
-		pool->name = new_name;
-	return old_name;
+	assert(name != NULL);
+	snprintf(pool->name, sizeof(pool->name), "%s", name);
 }
 
 size_t
diff --git a/core/tarantool.m b/core/tarantool.m
index 1bf7b7ff4f73e50aca9e70e898ac2e4181307021..918fb6103fa633cece4a705f1c5ea08df1a4b993 100644
--- a/core/tarantool.m
+++ b/core/tarantool.m
@@ -199,7 +199,7 @@ snapshot(void *ev, int events __attribute__((unused)))
 		return WEXITSTATUS(fiber->cw.rstatus);
 	}
 
-	fiber->name = "dumper";
+	fiber_set_name(fiber, "dumper");
 	set_proc_title("dumper (%" PRIu32 ")", getppid());
 	fiber_destroy_all();
 	palloc_free_unused();
diff --git a/include/fiber.h b/include/fiber.h
index a23821234173a5228b530bc902ac45a9ed33d278..5ab9e751cea45b8d95ea3d47974f94874e9513b3 100644
--- a/include/fiber.h
+++ b/include/fiber.h
@@ -42,6 +42,8 @@
 
 #include <exceptions.h>
 
+#define FIBER_NAME_MAXLEN 16
+
 #define FIBER_READING_INBOX 0x1
 #define FIBER_RAISE	    0x2
 
@@ -81,7 +83,7 @@ struct fiber {
 
 	struct ring *inbox;
 
-	const char *name;
+	char name[FIBER_NAME_MAXLEN];
 	void (*f) (void *);
 	void *f_data;
 
@@ -115,6 +117,7 @@ extern struct fiber *fiber;
 
 void fiber_init(void);
 struct fiber *fiber_create(const char *name, int fd, int inbox_size, void (*f) (void *), void *);
+void fiber_set_name(struct fiber *fiber, const char *name);
 void wait_for(int events);
 void wait_for_child(pid_t pid);
 void unwait(int events);
diff --git a/include/palloc.h b/include/palloc.h
index 81b1b74e53aa973c90c3c0a0436c13872d9ce6c0..370f86ece8584f6923cd49cf5fd72816376039fd 100644
--- a/include/palloc.h
+++ b/include/palloc.h
@@ -43,7 +43,7 @@ void prelease_after(struct palloc_pool *pool, size_t after);
 struct palloc_pool *palloc_create_pool(const char *name);
 void palloc_destroy_pool(struct palloc_pool *);
 void palloc_free_unused(void);
-const char *palloc_name(struct palloc_pool *, const char *);
+void palloc_set_name(struct palloc_pool *, const char *);
 size_t palloc_allocated(struct palloc_pool *);
 
 void palloc_stat(struct tbuf *buf);
diff --git a/mod/feeder/feeder.m b/mod/feeder/feeder.m
index 3afd4479363d2a6d584a6c41c6a39d67daddd451..b6ba93da1fd23380e07d305b9f468a488cb49f1d 100644
--- a/mod/feeder/feeder.m
+++ b/mod/feeder/feeder.m
@@ -70,7 +70,7 @@ recover_feed_slave(int sock)
 
 	fiber->has_peer = true;
 	fiber->fd = sock;
-	fiber->name = "feeder";
+	fiber_set_name(fiber, "feeder");
 	set_proc_title("feeder:client_handler%s %s", custom_proc_title, fiber_peer_name(fiber));
 
 	ev_default_loop(0);