Index: uspace/lib/c/include/context.h
===================================================================
--- uspace/lib/c/include/context.h	(revision 338d54a7c4a77bbe3bf0bdff3c750bad8bb1ea9a)
+++ uspace/lib/c/include/context.h	(revision 338d54a7c4a77bbe3bf0bdff3c750bad8bb1ea9a)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018 CZ.NIC, z.s.p.o.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LIBC_CONTEXT_H_
+#define LIBC_CONTEXT_H_
+
+#include <_bits/size_t.h>
+#include <libarch/fibril_context.h>
+
+/* Context initialization data. */
+typedef struct {
+	void (*fn)(void);
+	void *stack_base;
+	size_t stack_size;
+	void *tls;
+} context_create_t;
+
+extern void context_swap(context_t *self, context_t *other);
+extern void context_create(context_t *context, const context_create_t *arg);
+extern uintptr_t context_get_fp(context_t *ctx);
+extern uintptr_t context_get_pc(context_t *ctx);
+
+// TODO: These should go away.
+
+extern int context_save(context_t *ctx) __attribute__((returns_twice));
+extern void context_restore(context_t *ctx) __attribute__((noreturn));
+
+#endif
+
Index: uspace/lib/c/include/fibril.h
===================================================================
--- uspace/lib/c/include/fibril.h	(revision a35b458e9db1ca95e679799dc7c1b12c83359ca3)
+++ uspace/lib/c/include/fibril.h	(revision 338d54a7c4a77bbe3bf0bdff3c750bad8bb1ea9a)
@@ -36,15 +36,8 @@
 #define LIBC_FIBRIL_H_
 
-#include <libarch/fibril.h>
+#include <context.h>
 #include <types/common.h>
 #include <adt/list.h>
 #include <libarch/tls.h>
-
-#define context_set_generic(c, _pc, stack, size, ptls) \
-	do { \
-		(c)->pc = (sysarg_t) (_pc); \
-		(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \
-		(c)->tls = (sysarg_t) (ptls); \
-	} while (0)
 
 #define FIBRIL_WRITER	1
@@ -86,11 +79,6 @@
 #define fibril_local __thread
 
-extern int context_save(context_t *ctx) __attribute__((returns_twice));
-extern void context_restore(context_t *ctx) __attribute__((noreturn));
-
 #define FIBRIL_DFLT_STK_SIZE	0
 
-#define fibril_create(func, arg) \
-	fibril_create_generic((func), (arg), FIBRIL_DFLT_STK_SIZE)
 extern fid_t fibril_create_generic(errno_t (*func)(void *), void *arg, size_t);
 extern void fibril_destroy(fid_t fid);
@@ -103,4 +91,9 @@
 extern fid_t fibril_get_id(void);
 
+static inline fid_t fibril_create(errno_t (*func)(void *), void *arg)
+{
+	return fibril_create_generic(func, arg, FIBRIL_DFLT_STK_SIZE);
+}
+
 static inline int fibril_yield(void)
 {
