diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 52c02b9f426e5c07b0499f24478dffcfb53e8271..29476b026c4b16740d82dff5f3aea04a1c1e85d9 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -54,6 +54,7 @@ typedef _Bool bool;
 #define API_DISP_PIXEL             0x28
 #define API_DISP_FRAMEBUFFER       0x29
 #define API_DISP_BACKLIGHT         0x2a
+#define API_DISP_PRINT_ADV         0x2b
 
 /* API_BATTERY_VOLTAGE              0x30 */
 #define API_BATTERY_CURRENT        0x31
@@ -1239,6 +1240,40 @@ API(API_DISP_PRINT,
 	    uint16_t bg)
     );
 
+/*
+ * Font Selection
+ */
+enum disp_font_name {
+	DISP_FONT8  = 0, 
+	DISP_FONT12 = 1,
+	DISP_FONT16 = 2,
+	DISP_FONT20 = 3,
+	DISP_FONT24 = 4,
+};
+
+/**
+ * Prints a string into the display framebuffer with font type selectable
+ *
+ * :param fontName: number of font, use FontName enum
+ * :param posx: x position to print to. 0 <= x <= 160
+ * :param posy: y position to print to. 0 <= y <= 80
+ * :param pString: string to print
+ * :param fg: foreground color in rgb565
+ * :param bg: background color in rgb565
+ * :return: ``0`` on success or a negative value in case of an error:
+ *
+ *    - ``-EBUSY``: Display was already locked from another task.
+ */
+API(API_DISP_PRINT_ADV,
+	int epic_disp_print_adv(
+		uint8_t font,
+		uint16_t posx,
+		uint16_t posy,
+		const char *pString,
+		uint16_t fg,
+		uint16_t bg)
+);
+
 /**
  * Fills the whole screen with one color
  *
diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c
index ed8757fba9b6a90844dc8d4aa61b694cc41948f4..fe89fc324b41f7f9f944b0de4ce087558ac5a45e 100644
--- a/epicardium/modules/display.c
+++ b/epicardium/modules/display.c
@@ -27,12 +27,40 @@ int epic_disp_print(
 	const char *pString,
 	uint16_t fg,
 	uint16_t bg
+) {
+	return epic_disp_print_adv(DISP_FONT20, posx, posy, pString, fg, bg);
+}
+
+static const sFONT *font_map[] = {
+	[DISP_FONT8] = &Font8,   [DISP_FONT12] = &Font12,
+	[DISP_FONT16] = &Font16, [DISP_FONT20] = &Font20,
+	[DISP_FONT24] = &Font24,
+};
+
+int epic_disp_print_adv(
+	uint8_t font,
+	uint16_t posx,
+	uint16_t posy,
+	const char *pString,
+	uint16_t fg,
+	uint16_t bg
 ) {
 	int cl = check_lock();
+	if (font >= (sizeof(font_map) / sizeof(sFONT *))) {
+		return -EINVAL;
+	}
 	if (cl < 0) {
 		return cl;
 	} else {
-		gfx_puts(&Font20, &display_screen, posx, posy, pString, fg, bg);
+		gfx_puts(
+			font_map[font],
+			&display_screen,
+			posx,
+			posy,
+			pString,
+			fg,
+			bg
+		);
 		return 0;
 	}
 }
diff --git a/lib/gfx/gfx.c b/lib/gfx/gfx.c
index 9d27d2a5530e168e0ba4cbc795c2fcf27e135885..5af5bbb360248650fc40cb1ec445d9091c90575d 100644
--- a/lib/gfx/gfx.c
+++ b/lib/gfx/gfx.c
@@ -33,7 +33,7 @@ struct gfx_region gfx_screen(struct framebuffer *fb)
 	return r;
 }
 
-static inline int letter_bit(sFONT *font, char c, int x, int y)
+static inline int letter_bit(const sFONT *font, char c, int x, int y)
 {
 	if (x < 0 || y < 0)
 		return 0;
@@ -53,7 +53,7 @@ static inline int letter_bit(sFONT *font, char c, int x, int y)
 }
 
 void gfx_putchar(
-	sFONT *font,
+	const sFONT *font,
 	struct gfx_region *r,
 	int x,
 	int y,
@@ -78,7 +78,7 @@ void gfx_putchar(
 }
 
 void gfx_puts(
-	sFONT *font,
+	const sFONT *font,
 	struct gfx_region *r,
 	int x,
 	int y,
diff --git a/lib/gfx/gfx.h b/lib/gfx/gfx.h
index 428b196c6a41465230538da60a6ff0ce3fccafb5..0f64a429b59170182077b7d01e2d1cd027743974 100644
--- a/lib/gfx/gfx.h
+++ b/lib/gfx/gfx.h
@@ -14,9 +14,9 @@ struct gfx_region {
 
 void gfx_setpixel(struct gfx_region *r, int x, int y, Color c);
 struct gfx_region gfx_screen(struct framebuffer *fb);
-void gfx_putchar(sFONT *font, struct gfx_region *reg, int x, int y, char ch,
+void gfx_putchar(const sFONT *font, struct gfx_region *reg, int x, int y, char ch,
 						        Color fg, Color bg);
-void gfx_puts(sFONT *font, struct gfx_region *reg, int x, int y,
+void gfx_puts(const sFONT *font, struct gfx_region *reg, int x, int y,
 			   const char *str, Color fg, Color bg);
 Color gfx_color_rgb_f(struct gfx_region *reg, float r, float g, float b);
 Color gfx_color_rgb(struct gfx_region *reg, uint8_t r, uint8_t g, uint8_t b);
diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py
index e957977d6fc3603889f3155e515d351dc8f1753b..7b51cef374f8006b550ca955230a5ef9f3652d6c 100644
--- a/pycardium/modules/py/display.py
+++ b/pycardium/modules/py/display.py
@@ -1,6 +1,13 @@
 import sys_display
 import color
 
+# font enumeration
+FONT8 = 0
+FONT12 = 1
+FONT16 = 2
+FONT20 = 3
+FONT24 = 4
+
 
 class Display:
     """
@@ -61,7 +68,7 @@ class Display:
         sys_display.clear(col)
         return self
 
-    def print(self, text, *, fg=None, bg=None, posx=0, posy=0):
+    def print(self, text, *, fg=None, bg=None, posx=0, posy=0, font=FONT20):
         """
         Prints a string on the display. Font size is locked to 20px
 
@@ -70,11 +77,29 @@ class Display:
         :param bg: Background color (expects RGB triple)
         :param posx: X-Position of the first character, 0 <= posx <= 160
         :param posy: Y-Position of the first character, 0 <= posy <= 80
+        :param font: 0 <= font <= 4 (currently) selects a font
+
+        Avaiable Fonts:
+
+         - :py:data:`display.FONT8`
+         - :py:data:`display.FONT12`
+         - :py:data:`display.FONT16`
+         - :py:data:`display.FONT20`
+         - :py:data:`display.FONT24`
+
+         **Example:**
+
+        .. code-block:: python
+
+            with display.open() as d:
+                d.clear()
+                d.print('Hello Earth!', font=display.FONT24)
+                d.update()
         """
         fg = fg or color.WHITE
         bg = bg or color.BLACK
 
-        sys_display.print(text, posx, posy, fg, bg)
+        sys_display.print_adv(text, posx, posy, fg, bg, font)
         return self
 
     def pixel(self, x, y, *, col=None):
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index a02bcbd87b08641181690f91720438a02583b5b2..c5813602f9990763e91c17dc25746f59e83eb07c 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -85,6 +85,7 @@ Q(read_thermistor_voltage)
 Q(sys_display)
 Q(display)
 Q(print)
+Q(print_adv)
 Q(pixel)
 Q(backlight)
 Q(line)
diff --git a/pycardium/modules/sys_display.c b/pycardium/modules/sys_display.c
index f5523d54831695679965ddcb76e7df8c6fa2ba29..4f92ab92dcc2cfc8cede58018c8778fe9e345918 100644
--- a/pycardium/modules/sys_display.c
+++ b/pycardium/modules/sys_display.c
@@ -53,6 +53,30 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
 	display_print_obj, 5, 5, mp_display_print
 );
 
+/* print something on the display */
+static mp_obj_t mp_display_print_adv(size_t n_args, const mp_obj_t *args)
+{
+	if (!mp_obj_is_str_or_bytes(args[0])) {
+		mp_raise_TypeError("input text must be a string");
+	}
+	GET_STR_DATA_LEN(args[0], print, print_len);
+	uint32_t posx    = mp_obj_get_int(args[1]);
+	uint32_t posy    = mp_obj_get_int(args[2]);
+	uint32_t fg      = get_color(args[3]);
+	uint32_t bg      = get_color(args[4]);
+	uint8_t fontName = mp_obj_get_int(args[5]);
+	int res          = epic_disp_print_adv(
+                fontName, posx, posy, (const char *)print, fg, bg
+	);
+	if (res < 0) {
+		mp_raise_OSError(-res);
+	}
+	return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
+	display_print_adv_obj, 6, 6, mp_display_print_adv
+);
+
 /* draw pixel on the display */
 static mp_obj_t mp_display_pixel(size_t n_args, const mp_obj_t *args)
 {
@@ -234,6 +258,7 @@ static const mp_rom_map_elem_t display_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&display_open_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&display_close_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&display_print_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_print_adv), MP_ROM_PTR(&display_print_adv_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_pixel), MP_ROM_PTR(&display_pixel_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&display_backlight_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&display_line_obj) },