Index: uspace/app/fontedit/fontedit.c
===================================================================
--- uspace/app/fontedit/fontedit.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/app/fontedit/fontedit.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -38,5 +38,7 @@
 #include <guigfx/canvas.h>
 #include <gfx/color.h>
+#include <gfx/font.h>
 #include <gfx/render.h>
+#include <gfx/typeface.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -117,5 +119,7 @@
 	canvas_t *canvas = NULL;
 	font_edit_t *fedit = NULL;
+	gfx_typeface_t *tface = NULL;
 	gfx_font_t *font = NULL;
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics;
 	gfx_coord_t vw, vh;
@@ -178,7 +182,15 @@
 
 	gc = canvas_gc_get_ctx(cgc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	if (rc != EOK) {
+		printf("Error creating typeface.\n");
+		goto error;
+	}
+
+	gfx_font_props_init(&props);
 	gfx_font_metrics_init(&metrics);
 
-	rc = gfx_font_create(gc, &metrics, &font);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
 	if (rc != EOK) {
 		printf("Error creating font.\n");
@@ -190,5 +202,5 @@
 	fedit->width = vw;
 	fedit->height = vh;
-	fedit->font = font;
+	fedit->typeface = tface;
 
 	*rfedit = fedit;
Index: uspace/app/fontedit/fontedit.h
===================================================================
--- uspace/app/fontedit/fontedit.h	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/app/fontedit/fontedit.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -37,5 +37,5 @@
 #define FONTEDIT_H
 
-#include <gfx/font.h>
+#include <gfx/typeface.h>
 #include <guigfx/canvas.h>
 
@@ -50,6 +50,6 @@
 	/** Window height */
 	int height;
-	/** Font */
-	gfx_font_t *font;
+	/** Typeface */
+	gfx_typeface_t *typeface;
 } font_edit_t;
 
Index: uspace/lib/gfxfont/include/gfx/font.h
===================================================================
--- uspace/lib/gfxfont/include/gfx/font.h	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/include/gfx/font.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -42,11 +42,16 @@
 #include <types/gfx/font.h>
 #include <types/gfx/glyph.h>
+#include <types/gfx/typeface.h>
 
 extern void gfx_font_metrics_init(gfx_font_metrics_t *);
-extern errno_t gfx_font_create(gfx_context_t *, gfx_font_metrics_t *,
-    gfx_font_t **);
-extern void gfx_font_destroy(gfx_font_t *);
+extern void gfx_font_props_init(gfx_font_props_t *);
+extern void gfx_font_get_props(gfx_font_info_t *, gfx_font_props_t *);
+extern errno_t gfx_font_create(gfx_typeface_t *, gfx_font_props_t *,
+    gfx_font_metrics_t *, gfx_font_t **);
+extern errno_t gfx_font_open(gfx_font_info_t *, gfx_font_t **);
+extern void gfx_font_close(gfx_font_t *);
 extern void gfx_font_get_metrics(gfx_font_t *, gfx_font_metrics_t *);
-extern errno_t gfx_font_set_metrics(gfx_font_t *, gfx_font_metrics_t *);
+extern errno_t gfx_font_set_metrics(gfx_font_t *,
+    gfx_font_metrics_t *);
 extern gfx_glyph_t *gfx_font_first_glyph(gfx_font_t *);
 extern gfx_glyph_t *gfx_font_next_glyph(gfx_glyph_t *);
Index: uspace/lib/gfxfont/include/gfx/typeface.h
===================================================================
--- uspace/lib/gfxfont/include/gfx/typeface.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
+++ uspace/lib/gfxfont/include/gfx/typeface.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * 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.
+ */
+
+/** @addtogroup libgfxfont
+ * @{
+ */
+/**
+ * @file Typeface
+ */
+
+#ifndef _GFX_TYPEFACE_H
+#define _GFX_TYPEFACE_H
+
+#include <errno.h>
+#include <stddef.h>
+#include <types/gfx/context.h>
+#include <types/gfx/font.h>
+#include <types/gfx/glyph.h>
+#include <types/gfx/typeface.h>
+
+extern errno_t gfx_typeface_create(gfx_context_t *, gfx_typeface_t **);
+extern void gfx_typeface_destroy(gfx_typeface_t *);
+extern gfx_font_info_t *gfx_typeface_first_font(gfx_typeface_t *);
+extern gfx_font_info_t *gfx_typeface_next_font(gfx_font_info_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/gfxfont/include/types/gfx/font.h
===================================================================
--- uspace/lib/gfxfont/include/types/gfx/font.h	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/include/types/gfx/font.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -42,19 +42,24 @@
 typedef struct gfx_font gfx_font_t;
 
-/** Font metrics */
+struct gfx_font_info;
+typedef struct gfx_font_info gfx_font_info_t;
+
+/** Font flags */
+typedef enum {
+	/** Bold */
+	gff_bold = 0x1,
+	/** Italic */
+	gff_italic = 0x2,
+	/** Bold, italic */
+	gff_bold_italic = gff_bold | gff_italic
+} gfx_font_flags_t;
+
+/** Font properties */
 typedef struct {
-	/** Ascent */
-	gfx_coord_t ascent;
-	/** Descent */
-	gfx_coord_t descent;
-	/** Leading */
-	gfx_coord_t leading;
-} gfx_font_metrics_t;
-
-/** Text metrics */
-typedef struct {
-	/** Bounding rectangle (not including oversize elements) */
-	gfx_rect_t bounds;
-} gfx_text_metrics_t;
+	/** Size */
+	gfx_coord_t size;
+	/** Flags */
+	gfx_font_flags_t flags;
+} gfx_font_props_t;
 
 #endif
Index: uspace/lib/gfxfont/include/types/gfx/typeface.h
===================================================================
--- uspace/lib/gfxfont/include/types/gfx/typeface.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
+++ uspace/lib/gfxfont/include/types/gfx/typeface.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * 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.
+ */
+
+/** @addtogroup libgfxfont
+ * @{
+ */
+/**
+ * @file Font types
+ */
+
+#ifndef _TYPES_GFX_TYPEFACE_H
+#define _TYPES_GFX_TYPEFACE_H
+
+#include <types/gfx/coord.h>
+
+struct gfx_typeface;
+typedef struct gfx_typeface gfx_typeface_t;
+
+/** Font metrics */
+typedef struct {
+	/** Ascent */
+	gfx_coord_t ascent;
+	/** Descent */
+	gfx_coord_t descent;
+	/** Leading */
+	gfx_coord_t leading;
+} gfx_font_metrics_t;
+
+/** Text metrics */
+typedef struct {
+	/** Bounding rectangle (not including oversize elements) */
+	gfx_rect_t bounds;
+} gfx_text_metrics_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/gfxfont/meson.build
===================================================================
--- uspace/lib/gfxfont/meson.build	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/meson.build	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -32,4 +32,5 @@
 	'src/glyph.c',
 	'src/glyph_bmp.c',
+	'src/typeface.c',
 )
 
@@ -39,3 +40,4 @@
 	'test/glyph_bmp.c',
 	'test/main.c',
+	'test/typeface.c',
 )
Index: uspace/lib/gfxfont/private/font.h
===================================================================
--- uspace/lib/gfxfont/private/font.h	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/private/font.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -43,4 +43,5 @@
 #include <types/gfx/context.h>
 #include <types/gfx/font.h>
+#include <types/gfx/typeface.h>
 
 /** Font
@@ -55,6 +56,6 @@
  */
 struct gfx_font {
-	/** Graphics context of the font */
-	gfx_context_t *gc;
+	/** Containing typeface */
+	struct gfx_typeface *typeface;
 	/** Font metrics */
 	gfx_font_metrics_t metrics;
@@ -67,4 +68,19 @@
 };
 
+/** Font info
+ *
+ * This is an entry in the list of fonts in typeface
+ */
+struct gfx_font_info {
+	/** Containing typeface */
+	struct gfx_typeface *typeface;
+	/** Link to @c typeface->fonts */
+	link_t lfonts;
+	/** Font properties */
+	gfx_font_props_t props;
+	/** Font or @c NULL if font is not present in memory */
+	struct gfx_font *font;
+};
+
 extern errno_t gfx_font_splice_at_glyph(gfx_font_t *, gfx_glyph_t *,
     gfx_coord_t, gfx_coord_t);
Index: uspace/lib/gfxfont/private/typeface.h
===================================================================
--- uspace/lib/gfxfont/private/typeface.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
+++ uspace/lib/gfxfont/private/typeface.h	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * 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.
+ */
+
+/** @addtogroup libgfxfont
+ * @{
+ */
+/**
+ * @file Typeface structure
+ *
+ */
+
+#ifndef _GFX_PRIVATE_TYPEFACE_H
+#define _GFX_PRIVATE_TYPEFACE_H
+
+#include <adt/list.h>
+#include <errno.h>
+#include <types/gfx/bitmap.h>
+#include <types/gfx/context.h>
+#include <types/gfx/typeface.h>
+
+/** Typeface
+ *
+ * A typeface can contain several fonts of varying size and attributes
+ * (such as bold, italic). Fonts present in a typeface can be enumerated
+ * without actually loading them into memory.
+ *
+ * This is private to libgfxfont.
+ */
+struct gfx_typeface {
+	/** Graphics context of the typeface */
+	gfx_context_t *gc;
+	/** Fonts (of gfx_font_info_t) */
+	list_t fonts;
+};
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/gfxfont/src/font.c
===================================================================
--- uspace/lib/gfxfont/src/font.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/src/font.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -44,4 +44,5 @@
 #include "../private/font.h"
 #include "../private/glyph.h"
+#include "../private/typeface.h"
 
 /** Initialize font metrics structure.
@@ -57,7 +58,29 @@
 }
 
-/** Create font in graphics context.
- *
- * @param gc Graphic context
+/** Initialize font properties structure.
+ *
+ * Font properties structure must always be initialized using this function
+ * first.
+ *
+ * @param props Font properties structure
+ */
+void gfx_font_props_init(gfx_font_props_t *props)
+{
+	memset(props, 0, sizeof(gfx_font_props_t));
+}
+
+/** Get font properties.
+ *
+ * @param finfo Font info
+ * @param props Place to store font properties
+ */
+void gfx_font_get_props(gfx_font_info_t *finfo, gfx_font_props_t *props)
+{
+	*props = finfo->props;
+}
+
+/** Create font.
+ *
+ * @param tface Typeface
  * @param metrics Font metrics
  * @param rfont Place to store pointer to new font
@@ -67,22 +90,33 @@
  *         was lost
  */
-errno_t gfx_font_create(gfx_context_t *gc, gfx_font_metrics_t *metrics,
-    gfx_font_t **rfont)
-{
-	gfx_font_t *font;
+errno_t gfx_font_create(gfx_typeface_t *tface, gfx_font_props_t *props,
+    gfx_font_metrics_t *metrics, gfx_font_t **rfont)
+{
+	gfx_font_info_t *finfo = NULL;
+	gfx_font_t *font = NULL;
 	gfx_bitmap_params_t params;
 	errno_t rc;
 
+	finfo = calloc(1, sizeof(gfx_font_info_t));
+	if (finfo == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
 	font = calloc(1, sizeof(gfx_font_t));
-	if (font == NULL)
-		return ENOMEM;
-
-	font->gc = gc;
+	if (font == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	finfo->typeface = tface;
+	finfo->props = *props;
+	finfo->font = font;
+	font->typeface = tface;
 
 	rc = gfx_font_set_metrics(font, metrics);
 	if (rc != EOK) {
 		assert(rc == EINVAL);
-		free(font);
-		return rc;
+		goto error;
 	}
 
@@ -91,21 +125,47 @@
 	params.rect = font->rect;
 
-	rc = gfx_bitmap_create(font->gc, &params, NULL, &font->bitmap);
-	if (rc != EOK) {
-		free(font);
-		return rc;
-	}
+	rc = gfx_bitmap_create(tface->gc, &params, NULL, &font->bitmap);
+	if (rc != EOK)
+		goto error;
 
 	font->metrics = *metrics;
 	list_initialize(&font->glyphs);
+	list_append(&finfo->lfonts, &tface->fonts);
 	*rfont = font;
 	return EOK;
-}
-
-/** Destroy font.
- *
- * @param font Font
- */
-void gfx_font_destroy(gfx_font_t *font)
+error:
+	if (finfo != NULL)
+		free(finfo);
+	if (font != NULL)
+		free(font);
+	return rc;
+}
+
+/** Open font.
+ *
+ * @param finfo Font info
+ * @param rfont Place to store pointer to open font
+ * @return EOK on success or an error code
+ */
+errno_t gfx_font_open(gfx_font_info_t *finfo, gfx_font_t **rfont)
+{
+	if (finfo->font == NULL) {
+		/*
+		 * We cannot load an absent font yet.
+		 * This should not happen.
+		 */
+		assert(false);
+		return ENOTSUP;
+	}
+
+	*rfont = finfo->font;
+	return EOK;
+}
+
+/** Close font.
+ *
+ * @param font Font
+ */
+void gfx_font_close(gfx_font_t *font)
 {
 	gfx_glyph_t *glyph;
@@ -232,5 +292,5 @@
 		params.rect.p1.y = height;
 
-	rc = gfx_bitmap_create(font->gc, &params, NULL, &nbitmap);
+	rc = gfx_bitmap_create(font->typeface->gc, &params, NULL, &nbitmap);
 	if (rc != EOK)
 		goto error;
Index: uspace/lib/gfxfont/src/glyph_bmp.c
===================================================================
--- uspace/lib/gfxfont/src/glyph_bmp.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/src/glyph_bmp.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -37,5 +37,4 @@
 #include <gfx/bitmap.h>
 #include <gfx/coord.h>
-#include <gfx/font.h>
 #include <gfx/glyph_bmp.h>
 #include <io/pixelmap.h>
Index: uspace/lib/gfxfont/src/typeface.c
===================================================================
--- uspace/lib/gfxfont/src/typeface.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
+++ uspace/lib/gfxfont/src/typeface.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * 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.
+ */
+
+/** @addtogroup libgfxfont
+ * @{
+ */
+/**
+ * @file Typeface
+ */
+
+#include <adt/list.h>
+#include <assert.h>
+#include <errno.h>
+#include <gfx/bitmap.h>
+#include <gfx/glyph.h>
+#include <gfx/typeface.h>
+#include <mem.h>
+#include <stdlib.h>
+#include "../private/font.h"
+#include "../private/glyph.h"
+#include "../private/typeface.h"
+
+/** Create typeface in graphics context.
+ *
+ * @param gc Graphic context
+ * @param rtface Place to store pointer to new typeface
+ *
+ * @return EOK on success, EINVAL if parameters are invald,
+ *         ENOMEM if insufficient resources, EIO if graphic device connection
+ *         was lost
+ */
+errno_t gfx_typeface_create(gfx_context_t *gc, gfx_typeface_t **rtface)
+{
+	gfx_typeface_t *tface;
+
+	tface = calloc(1, sizeof(gfx_typeface_t));
+	if (tface == NULL)
+		return ENOMEM;
+
+	tface->gc = gc;
+	list_initialize(&tface->fonts);
+
+	*rtface = tface;
+	return EOK;
+}
+
+/** Destroy typeface.
+ *
+ * @param tface Typeface
+ */
+void gfx_typeface_destroy(gfx_typeface_t *tface)
+{
+	free(tface);
+}
+
+/** Get info on first font in typeface.
+ *
+ * @param tface Typeface
+ * @return First font info or @c NULL if there are none
+ */
+gfx_font_info_t *gfx_typeface_first_font(gfx_typeface_t *tface)
+{
+	link_t *link;
+
+	link = list_first(&tface->fonts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, gfx_font_info_t, lfonts);
+}
+
+/** Get info on next font in typeface.
+ *
+ * @param cur Current font info
+ * @return Next font info in font or @c NULL if @a cur was the last one
+ */
+gfx_font_info_t *gfx_typeface_next_font(gfx_font_info_t *cur)
+{
+	link_t *link;
+
+	link = list_next(&cur->lfonts, &cur->typeface->fonts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, gfx_font_info_t, lfonts);
+}
+
+/** @}
+ */
Index: uspace/lib/gfxfont/test/font.c
===================================================================
--- uspace/lib/gfxfont/test/font.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/test/font.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -30,6 +30,8 @@
 #include <gfx/font.h>
 #include <gfx/glyph.h>
+#include <gfx/typeface.h>
 #include <pcut/pcut.h>
 #include "../private/font.h"
+#include "../private/typeface.h"
 
 PCUT_INIT;
@@ -70,18 +72,26 @@
 PCUT_TEST(create_destroy)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics;
-	gfx_font_t *font;
-	gfx_context_t *gc;
-	test_gc_t tgc;
-	errno_t rc;
-
-	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_font_metrics_init(&metrics);
-	rc = gfx_font_create(gc, &metrics, &font);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_font_destroy(font);
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
+
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -91,6 +101,8 @@
 PCUT_TEST(get_metrics)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics;
 	gfx_font_metrics_t gmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_context_t *gc;
@@ -106,5 +118,10 @@
 	metrics.leading = 3;
 
-	rc = gfx_font_create(gc, &metrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -114,5 +131,6 @@
 	PCUT_ASSERT_INT_EQUALS(metrics.leading, gmetrics.leading);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -122,14 +140,21 @@
 PCUT_TEST(set_metrics)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics1;
 	gfx_font_metrics_t metrics2;
 	gfx_font_metrics_t gmetrics;
-	gfx_font_t *font;
-	gfx_context_t *gc;
-	test_gc_t tgc;
-	errno_t rc;
-
-	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
 
 	gfx_font_metrics_init(&metrics1);
@@ -138,5 +163,5 @@
 	metrics1.leading = 3;
 
-	rc = gfx_font_create(gc, &metrics1, &font);
+	rc = gfx_font_create(tface, &props, &metrics1, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -154,5 +179,6 @@
 	PCUT_ASSERT_INT_EQUALS(metrics2.leading, gmetrics.leading);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -162,6 +188,8 @@
 PCUT_TEST(first_glyph)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics;
 	gfx_glyph_metrics_t gmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_context_t *gc;
@@ -176,5 +204,10 @@
 	gfx_font_metrics_init(&metrics);
 
-	rc = gfx_font_create(gc, &metrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -193,5 +226,6 @@
 
 	gfx_glyph_destroy(glyph);
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -201,6 +235,8 @@
 PCUT_TEST(next_glyph)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics;
 	gfx_glyph_metrics_t gmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_context_t *gc;
@@ -217,5 +253,10 @@
 	gfx_font_metrics_init(&metrics);
 
-	rc = gfx_font_create(gc, &metrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -240,5 +281,6 @@
 	gfx_glyph_destroy(glyph1);
 	gfx_glyph_destroy(glyph2);
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -248,5 +290,7 @@
 PCUT_TEST(search_glyph)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t metrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_context_t *gc;
@@ -261,5 +305,10 @@
 	gfx_font_metrics_init(&metrics);
 
-	rc = gfx_font_create(gc, &metrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -267,5 +316,6 @@
 	PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -275,5 +325,7 @@
 PCUT_TEST(splice_at_glyph)
 {
+	gfx_font_props_t props;
 	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -286,6 +338,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
 	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_font_create(tface, &props, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -299,5 +355,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
Index: uspace/lib/gfxfont/test/glyph.c
===================================================================
--- uspace/lib/gfxfont/test/glyph.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/test/glyph.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -32,4 +32,5 @@
 #include <gfx/glyph.h>
 #include <gfx/glyph_bmp.h>
+#include <gfx/typeface.h>
 #include <io/pixelmap.h>
 #include <pcut/pcut.h>
@@ -75,26 +76,33 @@
 PCUT_TEST(create_destroy)
 {
-	gfx_font_metrics_t fmetrics;
-	gfx_font_t *font;
-	gfx_glyph_metrics_t gmetrics;
-	gfx_glyph_t *glyph;
-	gfx_context_t *gc;
-	test_gc_t tgc;
-	errno_t rc;
-
-	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_glyph_metrics_init(&gmetrics);
-	rc = gfx_glyph_create(font, &gmetrics, &glyph);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_glyph_destroy(glyph);
-
-	gfx_font_destroy(font);
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_glyph_metrics_t gmetrics;
+	gfx_glyph_t *glyph;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_glyph_metrics_init(&gmetrics);
+	rc = gfx_glyph_create(font, &gmetrics, &glyph);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_glyph_destroy(glyph);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -104,5 +112,7 @@
 PCUT_TEST(get_metrics)
 {
-	gfx_font_metrics_t fmetrics;
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -116,6 +126,12 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -131,5 +147,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -139,5 +156,7 @@
 PCUT_TEST(set_metrics)
 {
-	gfx_font_metrics_t fmetrics;
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics1;
@@ -152,6 +171,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -172,5 +195,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -180,17 +204,23 @@
 PCUT_TEST(set_pattern)
 {
-	gfx_font_metrics_t fmetrics;
-	gfx_font_t *font;
-	gfx_glyph_metrics_t gmetrics;
-	gfx_glyph_t *glyph;
-	gfx_context_t *gc;
-	test_gc_t tgc;
-	errno_t rc;
-
-	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_glyph_metrics_t gmetrics;
+	gfx_glyph_t *glyph;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -215,5 +245,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -223,17 +254,23 @@
 PCUT_TEST(clear_pattern)
 {
-	gfx_font_metrics_t fmetrics;
-	gfx_font_t *font;
-	gfx_glyph_metrics_t gmetrics;
-	gfx_glyph_t *glyph;
-	gfx_context_t *gc;
-	test_gc_t tgc;
-	errno_t rc;
-
-	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_glyph_metrics_t gmetrics;
+	gfx_glyph_t *glyph;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *) &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -261,5 +298,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -269,5 +307,7 @@
 PCUT_TEST(matches)
 {
-	gfx_font_metrics_t fmetrics;
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -282,6 +322,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -315,5 +359,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -323,5 +368,7 @@
 PCUT_TEST(first_next_pattern)
 {
-	gfx_font_metrics_t fmetrics;
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -335,6 +382,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -360,5 +411,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -368,5 +420,7 @@
 PCUT_TEST(pattern_str)
 {
-	gfx_font_metrics_t fmetrics;
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -381,6 +435,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -406,5 +464,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -414,5 +473,7 @@
 PCUT_TEST(transfer)
 {
-	gfx_font_metrics_t fmetrics;
+	gfx_font_props_t fprops;
+	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -431,6 +492,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
+	gfx_font_metrics_init(&fmetrics);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -498,5 +563,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
Index: uspace/lib/gfxfont/test/glyph_bmp.c
===================================================================
--- uspace/lib/gfxfont/test/glyph_bmp.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/test/glyph_bmp.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -31,4 +31,5 @@
 #include <gfx/glyph.h>
 #include <gfx/glyph_bmp.h>
+#include <gfx/typeface.h>
 #include <pcut/pcut.h>
 
@@ -70,5 +71,7 @@
 PCUT_TEST(open_close)
 {
+	gfx_font_props_t fprops;
 	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -82,6 +85,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
 	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -102,5 +109,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -110,5 +118,7 @@
 PCUT_TEST(save)
 {
+	gfx_font_props_t fprops;
 	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -123,6 +133,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
 	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -174,5 +188,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -182,5 +197,7 @@
 PCUT_TEST(getpix)
 {
+	gfx_font_props_t fprops;
 	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -195,6 +212,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
 	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -218,5 +239,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -226,5 +248,7 @@
 PCUT_TEST(setpix_flip)
 {
+	gfx_font_props_t fprops;
 	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -239,6 +263,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
 	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -274,5 +302,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -282,5 +311,7 @@
 PCUT_TEST(setpix_externd)
 {
+	gfx_font_props_t fprops;
 	gfx_font_metrics_t fmetrics;
+	gfx_typeface_t *tface;
 	gfx_font_t *font;
 	gfx_glyph_metrics_t gmetrics;
@@ -296,6 +327,10 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&fprops);
 	gfx_font_metrics_init(&fmetrics);
-	rc = gfx_font_create(gc, &fmetrics, &font);
+	rc = gfx_font_create(tface, &fprops, &fmetrics, &font);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -343,5 +378,6 @@
 	gfx_glyph_destroy(glyph);
 
-	gfx_font_destroy(font);
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 	rc = gfx_context_delete(gc);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
Index: uspace/lib/gfxfont/test/main.c
===================================================================
--- uspace/lib/gfxfont/test/main.c	(revision d2100e23b019a7ed116b6d3d17c17625196dc4f7)
+++ uspace/lib/gfxfont/test/main.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -34,4 +34,5 @@
 PCUT_IMPORT(glyph);
 PCUT_IMPORT(glyph_bmp);
+PCUT_IMPORT(typeface);
 
 PCUT_MAIN();
Index: uspace/lib/gfxfont/test/typeface.c
===================================================================
--- uspace/lib/gfxfont/test/typeface.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
+++ uspace/lib/gfxfont/test/typeface.c	(revision 06b8383847ae4de1f2e464710f9877a9fbea7bc9)
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * 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.
+ */
+
+#include <gfx/context.h>
+#include <gfx/glyph.h>
+#include <gfx/typeface.h>
+#include <pcut/pcut.h>
+#include "../private/typeface.h"
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(typeface);
+
+static errno_t testgc_set_color(void *, gfx_color_t *);
+static errno_t testgc_fill_rect(void *, gfx_rect_t *);
+static errno_t testgc_bitmap_create(void *, gfx_bitmap_params_t *,
+    gfx_bitmap_alloc_t *, void **);
+static errno_t testgc_bitmap_destroy(void *);
+static errno_t testgc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
+static errno_t testgc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
+
+static gfx_context_ops_t test_ops = {
+	.set_color = testgc_set_color,
+	.fill_rect = testgc_fill_rect,
+	.bitmap_create = testgc_bitmap_create,
+	.bitmap_destroy = testgc_bitmap_destroy,
+	.bitmap_render = testgc_bitmap_render,
+	.bitmap_get_alloc = testgc_bitmap_get_alloc
+};
+
+typedef struct {
+	gfx_bitmap_params_t bm_params;
+	void *bm_pixels;
+	gfx_rect_t bm_srect;
+	gfx_coord2_t bm_offs;
+} test_gc_t;
+
+typedef struct {
+	test_gc_t *tgc;
+	gfx_bitmap_alloc_t alloc;
+	bool myalloc;
+} testgc_bitmap_t;
+
+/** Test creating and destroying typeface */
+PCUT_TEST(create_destroy)
+{
+	gfx_typeface_t *tface;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_typeface_destroy(tface);
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+PCUT_TEST(first_font)
+{
+	// TODO
+}
+
+PCUT_TEST(next_font)
+{
+	// TODO
+}
+
+static errno_t testgc_set_color(void *arg, gfx_color_t *color)
+{
+	return EOK;
+}
+
+static errno_t testgc_fill_rect(void *arg, gfx_rect_t *rect)
+{
+	return EOK;
+}
+
+static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
+    gfx_bitmap_alloc_t *alloc, void **rbm)
+{
+	test_gc_t *tgc = (test_gc_t *) arg;
+	testgc_bitmap_t *tbm;
+
+	tbm = calloc(1, sizeof(testgc_bitmap_t));
+	if (tbm == NULL)
+		return ENOMEM;
+
+	if (alloc == NULL) {
+		tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
+		    sizeof(uint32_t);
+		tbm->alloc.off0 = 0;
+		tbm->alloc.pixels = calloc(sizeof(uint32_t),
+		    tbm->alloc.pitch * (params->rect.p1.y - params->rect.p0.y));
+		tbm->myalloc = true;
+		if (tbm->alloc.pixels == NULL) {
+			free(tbm);
+			return ENOMEM;
+		}
+	} else {
+		tbm->alloc = *alloc;
+	}
+
+	tbm->tgc = tgc;
+	tgc->bm_params = *params;
+	tgc->bm_pixels = tbm->alloc.pixels;
+	*rbm = (void *)tbm;
+	return EOK;
+}
+
+static errno_t testgc_bitmap_destroy(void *bm)
+{
+	testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
+	if (tbm->myalloc)
+		free(tbm->alloc.pixels);
+	free(tbm);
+	return EOK;
+}
+
+static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
+    gfx_coord2_t *offs)
+{
+	testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
+	tbm->tgc->bm_srect = *srect;
+	tbm->tgc->bm_offs = *offs;
+	return EOK;
+}
+
+static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
+{
+	testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
+	*alloc = tbm->alloc;
+	return EOK;
+}
+
+PCUT_EXPORT(typeface);
