diff --git a/libports/run/mupdf.run b/libports/run/mupdf.run
new file mode 100644
index 000000000..569bb7aa0
--- /dev/null
+++ b/libports/run/mupdf.run
@@ -0,0 +1,102 @@
+build {
+ core init
+ drivers/timer
+ app/mupdf
+ drivers/framebuffer drivers/pci drivers/input
+}
+
+create_boot_directory
+
+set config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+append_if [have_spec sdl] config {
+
+
+
+
+
+
+ }
+
+append_if [have_spec pci] config {
+
+
+
+ }
+
+append_if [have_spec vesa] config {
+
+
+
+ }
+
+append_if [have_spec ps2] config {
+
+
+
+ }
+
+append config {
+
+
+
+
+
+
+
+
+}
+
+install_config $config
+
+#
+# Download test PDF file
+#
+if {![file exist bin/test.pdf]} {
+ set pdf_url "http://genode-labs.com/publications/genode-fpga-graphics-2009.pdf"
+ catch { exec wget $pdf_url -O bin/test.pdf] }
+}
+
+if {![file exist bin/test.pdf]} {
+ puts stderr "Could not download test PDF from '$pdf_url'"
+ exit 1
+}
+
+set boot_modules {
+ core init ld.lib.so timer
+ mupdf
+ libc.lib.so libm.lib.so libc_log.lib.so libc_rom.lib.so
+ openjpeg.lib.so freetype.lib.so libpng.lib.so zlib.lib.so jbig2dec.lib.so
+ mupdf.lib.so jpeg.lib.so
+ test.pdf
+}
+
+lappend_if [have_spec linux] boot_modules fb_sdl
+lappend_if [have_spec pci] boot_modules pci_drv
+lappend_if [have_spec vesa] boot_modules vesa_drv
+lappend_if [have_spec ps2] boot_modules ps2_drv
+
+build_boot_image $boot_modules
+
+append qemu_args " -m 768"
+
+run_genode_until forever
+
diff --git a/libports/src/app/mupdf/main.cc b/libports/src/app/mupdf/main.cc
new file mode 100644
index 000000000..7d4d056d8
--- /dev/null
+++ b/libports/src/app/mupdf/main.cc
@@ -0,0 +1,141 @@
+/*
+ * \brief MuPDF for Genode
+ * \author Norman Feske
+ * \date 2012-01-09
+ */
+
+/*
+ * Copyright (C) 2012 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* Genode includes */
+#include
+#include
+
+/* MuPDF includes */
+extern "C" {
+#include
+#include
+#include
+#include
+}
+
+/* libc includes */
+#include
+
+
+/**************************
+ ** Called from pdfapp.c **
+ **************************/
+
+void winrepaint(pdfapp_t *)
+{
+ PDBG("not implemented");
+}
+
+
+void winrepaintsearch(pdfapp_t *)
+{
+ PDBG("not implemented");
+}
+
+
+void wincursor(pdfapp_t *, int curs)
+{
+ PDBG("curs=%d - not implemented", curs);
+}
+
+
+void winerror(pdfapp_t *, fz_error error)
+{
+ PDBG("error=%d", error);
+ Genode::sleep_forever();
+}
+
+
+void winwarn(pdfapp_t *, char *msg)
+{
+ PWRN("MuPDF: %s", msg);
+}
+
+
+void winhelp(pdfapp_t *)
+{
+ PDBG("not implemented");
+}
+
+
+char *winpassword(pdfapp_t *, char *)
+{
+ PDBG("not implemented");
+ return NULL;
+}
+
+
+void winclose(pdfapp_t *app)
+{
+ PDBG("not implemented");
+}
+
+
+void winreloadfile(pdfapp_t *)
+{
+ PDBG("not implemented");
+}
+
+
+void wintitle(pdfapp_t *app, char *s)
+{
+ PDBG("s=\"%s\" - not implemented", s);
+}
+
+
+void winresize(pdfapp_t *app, int w, int h)
+{
+ PDBG("not implemented");
+}
+
+
+/******************
+ ** Main program **
+ ******************/
+
+int main(int, char **)
+{
+
+ static Framebuffer::Connection framebuffer;
+ Framebuffer::Session::Mode mode;
+ int width, height;
+ framebuffer.info(&width, &height, &mode);
+
+ PDBG("Framebuffer is %dx%d\n", width, height);
+
+ if (mode != Framebuffer::Session::RGB565) {
+ PERR("Color modes other than RGB565 are not supported. Exiting.");
+ return 1;
+ }
+
+
+ static pdfapp_t pdfapp;
+ pdfapp_init(&pdfapp);
+
+ pdfapp.scrw = width;
+ pdfapp.scrh = height;
+ pdfapp.resolution = 75; /* XXX read from config */
+ pdfapp.pageno = 1; /* XXX read from config */
+
+ char const *file_name = "test.pdf"; /* XXX read from config */
+
+ int fd = open(file_name, O_BINARY | O_RDONLY, 0666);
+ if (fd < 0) {
+ PERR("Could not open input file \"%s\", Exiting.", file_name);
+ return 2;
+ }
+ pdfapp_open(&pdfapp, (char *)file_name, fd, 0);
+
+ Genode::sleep_forever();
+ return 0;
+}
diff --git a/libports/src/app/mupdf/target.mk b/libports/src/app/mupdf/target.mk
new file mode 100644
index 000000000..5cd4587c1
--- /dev/null
+++ b/libports/src/app/mupdf/target.mk
@@ -0,0 +1,8 @@
+MUPDF_DIR = $(REP_DIR)/contrib/mupdf-0.9
+TARGET = mupdf
+SRC_C = pdfapp.c
+SRC_CC = main.cc
+LIBS = libc mupdf libc_log libc_rom
+INC_DIR += $(MUPDF_DIR)/apps
+
+vpath pdfapp.c $(MUPDF_DIR)/apps